PHPで自動に画像加工
大きな画像を元にサムネイルをつくる。
要件
縦横比が異なる画像をサムネイルとして縦横比を揃えた画像を用意したい
縦横比を揃える際は、中心から切り抜きたい
ポイント1.imagecopyresampled
imagecopyresampled($dst_image ,$src_image ,$dst_x ,$dst_y ,$src_x ,$src_y ,$dst_w ,$dst_h ,$src_w ,$src_h)
イメージの一部もしくは全部を新しいイメージにコピーする。拡縮も出来る。
引数 | |
---|---|
1.dst_image | コピー先の画像 |
2.src_image | 元の画像 |
3.dst_x | コピー先のx座標 |
4.dst_y | コピー先のy座標 |
5.src_x | 元画像切り出し先のx座標 |
6.src_y | 元画像切り出し先のy座標 |
7.dst_w | コピー先の幅 |
8.dst_h | コピー先の高さ |
9.src_w | 元画像切り出しの幅 |
10.src_h | 元画像切り出しの高さ |
戻り値 | |
Boolean | 成功した場合に TRUE を、失敗した場合に FALSE |
ポイント2.imagecreatetruecolor
imagecreatetruecolor($width ,$height)
イメージをメモリー上に新規に作成する
引数 | |
---|---|
1.width | 画像の幅 |
2.height | 画像の高さ |
戻り値 | |
resource | 画像リソース |
組み込み例
//画像パス
$image_path="画像パス";
//画像情報取得
$img_info=getimagesize($image_path);
//画像をメモリに
$image_resource = imagecreatefromjpeg($image_path);
//縦横の対比を指定
$Tate_hi=9;
$Yoko_hi=14;
//最大横幅を指定
$MAX_WIDE=600;
//元画像の縦横の対比調整値を取得
$W_Bai=($img_info[0]/$Yoko_hi);
$H_Bai=($img_info[1]/$Tate_hi);
//元画像の縦横の対比調整値を取得
if($W_Bai > $H_Bai){
//横からトリミング
//ヨコ調整後数値算出
$W_CYOUSEI=floor($H_Bai*$Yoko_hi);
//ヨコ切り取り幅算出(中央)
$W_KIRITORI=floor(($img_info[0]-$W_CYOUSEI)/2);
//空のイメージをメモリーにつくる
$image_out = imagecreatetruecolor($W_CYOUSEI,$img_info[1]);
//元の画像を切り取り、空のイメージに挿入する
$flg1=imagecopyresampled($image_out,$image_resource,
0,0,
$W_KIRITORI,0,
$W_CYOUSEI,$img_info[1],
$W_CYOUSEI,$img_info[1]
);
//拡縮値を算出
$SYUKUSO=($MAX_WIDE/$W_CYOUSEI);
//再度、空のイメージをメモリーにつくる
$image_out2 = imagecreatetruecolor(floor($W_CYOUSEI*$SYUKUSO),floor($img_info[1]*$SYUKUSO));
//切り取ったイメージを、拡縮して空のイメージに挿入する
$flg2=imagecopyresampled($image_out2,$image_out,
0,0,
0,0,
floor($W_CYOUSEI*$SYUKUSO),floor($img_info[1]*$SYUKUSO),
$W_CYOUSEI,$img_info[1]
);
}else{
//縦からトリミング
//タテ調整後数値算出
$H_CYOUSEI=floor($W_Bai*$Tate_hi);
//タテ切り取り幅算出(中央)
$H_KIRITORI=floor(($img_info[1]-$H_CYOUSEI)/2);
//空のイメージをメモリーにつくる
$image_out = imagecreatetruecolor($img_info[0],$H_CYOUSEI);
//元の画像を切り取り、空のイメージに挿入する
$flg1=imagecopyresampled($image_out,$image_resource,
0,0,
0,$H_KIRITORI,
$img_info[0],$H_CYOUSEI,
$img_info[0],$H_CYOUSEI
);
//拡縮値を算出
$SYUKUSO=($MAX_WIDE/$img_info[0]);
//再度、空のイメージをメモリーにつくる
$image_out2 = imagecreatetruecolor(floor($img_info[0]*$SYUKUSO),floor($H_CYOUSEI*$SYUKUSO));
//切り取ったイメージを、拡縮して空のイメージに挿入する
$flg2=imagecopyresampled($image_out2,$image_out,
0,0,
0,0,
floor($img_info[0]*$SYUKUSO),floor($H_CYOUSEI*$SYUKUSO),
$img_info[0],$H_CYOUSEI
);
}
if($flg1=true and $flg2=true ){
//ファイルとして画像出力する場合
imagejpeg($image_out2,"出力パス",100);
//画面へ出力する場合
header('Content-type: image/jpeg');
imagejpeg($image_out2);
}else{
//エラー用の画像を画面へ出力する
header('Content-type: image/jpeg');
readfile("エラー用の画像までのパス");
}
//イメージのメモリー開放
imagedestroy($image_resource);
imagedestroy($image_out);
imagedestroy($image_out2);
閲覧時の注意
・全てのブラウザでは対応されていないと思います。
・HTML5基準も取り入れています。
・ご指摘事項等ございましたら下のフォームからお知らせ頂けると助かります。