ブログBLOG

PHP 画像加工 サムネイルを作る

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基準も取り入れています。

・ご指摘事項等ございましたら下のフォームからお知らせ頂けると助かります。



 

コメント・ご感想の投稿

ニックネーム
メールアドレス
コメント
画像認証


上記、画像に記載のコードをご入力ください

コメント送信時の注意

・コメントの内容は確認後、内容の精査確認の上、反映させていただきます。
・メールアドレスは必須ではありません。公開されることもありません。