サーバーサイドでの画像処理は、ImageMagick を使ってましたが、脆弱性があり、使用回避することになり、PHP GD の利用に置換予定です。
[ ImageMagick 脆弱性情報 ]
https://www.mbsd.jp/blog/20180831.html
https://qiita.com/yoya/items/2076c1f5137d4041e3aa
https://blog.cybozu.io/entry/2018/08/21/080000[
[ 準備 ]
CentOS7の yum でインストールした7系では、何もしなくても GDライブラリが使えます。
Windows の場合、php.ini に以下の記述を追加して有効化します。
[PHP_GD2] extension=php_gd2.dll
[ コード例 ]
アプリケーションで、結果はファイルに保存
処理結果情報はJSONで返す
<?php
/**
* GD 画像ストレッチ
* argv : 1 : ソースファイル名, 2 : デストファイル名, 3 : 横ピクセルサイズ
*/
// 引数取得 //
$srcfnm = $argv[1];
$dstfnm = $argv[2];
$new_width = $argv[3];
// ** 縦長算出 ** //
// 画像サイズ取得 //
list($src_width, $src_height, $type) = getimagesize($srcfnm);
$ratio = (float) $src_width / $src_height;
$new_height = (int) ((float) $new_width / (float) $ratio);
//echo $srcfnm." -> ". $dstfnm. "\n";
//echo "PHP GD type:".$type . ":" . $src_width . ":" . $src_height . " => " . $new_width . ":" . $new_height."\n";
// 画像を読み込み再サンプリングして縮小 //
switch ($type) {
case IMAGETYPE_JPEG: // 2
$image = imagecreatefromjpeg($srcfnm);
break;
case IMAGETYPE_PNG: // 3
$image = imagecreatefrompng($srcfnm);
break;
case IMAGETYPE_GIF: // 1
$image = imagecreatefromgif($srcfnm);
break;
}
// 変換 //
$image_p = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $src_width, $src_height);
/* $new_width はキャスト不要 */
// ファイルに出力 //
$res = 1;
try {
if ($type == IMAGETYPE_JPEG) {
imagejpeg($image_p, $dstfnm, 100);
}
else if ($type == IMAGETYPE_PNG) {
imagepng($image_p, $dstfnm, 9);
}
else {
imagegif($image_p, $dstfnm, 100);
}
}
catch (Exception $ex) {
$res = 0;
}
imagedestroy($image);
imagedestroy($image_p);
// 連想配列に格納 //
$responce = [];
$responce["SrcW"] = $src_width;
$responce["SrcH"] = $src_height;
$responce["DstW"] = (int) $new_width; // <== 引数のままなので
$responce["DstH"] = $new_height;
$responce["Result"] = $res;
// JSONに変換して出力 //
echo json_encode($responce, JSON_PRETTY_PRINT);
?>