PHP GD で画像処理 (伸縮)

サーバーサイドでの画像処理は、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);

?>