画像を扱う前処理
ImageCreateFromJPEG($filename)
これでメモリ(このプログラム内)の中で扱える
画像をリサイズ
bool imagecopyresampled(resource $dst_image,resource $src_image,
int $dst_x,int $dst_y,int $src_x,int $src_y,int
$dst_w,int $dst_h,int $src_w,int $src_h)
パラメータ
dst_image
コピー先の画像リンクリソース。
src_image
コピー元の画像リンクリソース。
dst_x
コピー先の x 座標。
dst_y
コピー先の y 座標。
src_x
コピー元の x 座標。
src_y
コピー元の y 座標。
dst_w
コピー先の幅。
dst_h
コピー先の高さ。
src_w
コピー元の幅。
src_h
コピー元の高さ。
返り値
成功した場合に TRUE を、失敗した場合に FALSE を返します。
画像を出力or 保存
bool imagejpeg ( resource $image [, string $filename [, int $quality ]] )
引数
image
画像リソースを指定します。
filename
画像リソースをファイルに保存する場合、ファイル名を指定します。
quality
画像のクオリティを0(低品質)から100(高品質)で指定します。デフォルトは75です。
返り値
画像の出力・作成に成功した場合は trueを、その他の場合は flaseを返します。
実際にリサイズ
$filename = "画像パス"
if (mime_content_type($filename) == 'image/jpeg') {
$image = ImageCreateFromJPEG($filename);
$size = getimagesize($filename);
}else {
$image = ImageCreateFromPNG($filename);
$size = getimagesize($filename);
}
//白紙の画像を作成
$image2 = ImageCreateTrueColor(640, 480);
//リサイズ処理
imagecopyresampled($image2, $image, 0, 0, 0, 0, 640, 480, $size[0], $size[1]);
//保存
if (mime_content_type($filename) == 'image/jpeg') {
imagejpeg($image2, $filename);
}else {
imagepng($image2, $filename);
}
//メモリ解放
imagedestroy($image);
リサイズ問題
原寸は「横400px・縦180px」だが、横幅(widthプロパティに「200px」が指定された結果、縦横比を維持して高さは「90px」になる。
どちらかを指定すれば自動で、元画像の比率を保ったまま高さor横が決められる
width: auto;
リサイズ計算式
元の画像の横:X1、縦:Y1
リサイズ後の画像の横:X2、縦:Y2
とした時、
X2を任意の値にした時に、アスペクト比を保った状態でのY2の値は
Y2=X2/X1*Y1
実践
//retinadisplay対応
$resize_width = 462 * 2; //横幅決める
$resize_height = $resize_width / $size[0] * $size[1]; //縦を比率崩さず出す
//白紙の画像を作成
$image2 = ImageCreateTrueColor($resize_width, $resize_height);
//リサイズ処理
imagecopyresampled($image2, $image, 0, 0, 0, 0, $resize_width, $resize_height, $size[0], $size[1]);
完成
if (mime_content_type($filename) == 'image/jpeg') {
$image = ImageCreateFromJPEG($filename);
$size = getimagesize($filename);
}else {
$image = ImageCreateFromPNG($filename);
$size = getimagesize($filename);
}
//retinadisplay対応
$resize_width = 462 * 2; //横幅決める
$resize_height = $resize_width / $size[0] * $size[1]; //縦を比率崩さず出す
//白紙の画像を作成
$image2 = ImageCreateTrueColor($resize_width, $resize_height);
$x = 0;
$y = 0;
$x = floor(($size[0] - $size[1]) / 2); //切り取るx軸の中心
$y = floor(($size[1] - $size[0]) / 2); //切り取るx軸の中心
//リサイズ処理
imagecopyresampled($image2, $image, 0, 0, $x, $y, $resize_width, $resize_height, $size[0], $size[1]);
//保存
if (mime_content_type($filename) == 'image/jpeg') {
imagejpeg($image2, $filename);
}else {
imagepng($image2, $filename);
}
//メモリ解放
imagedestroy($image);
参考:https://blog.ver001.com/php_image_resize_object-fit/
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11117777576
https://qiita.com/mikakane/items/290301a308277a384c2d
http://iekasegu.work/column.php?no=144