湯川秀樹 : 現実

現実は痛切である。

あらゆる甘さが排斥される。

現実は予想できぬ豹変をする。

あらゆる平衡は早晩打破せられる。

現実は複雑である。

あらゆる早合点は禁物である。

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

[ コード例 ]


<?php

/**
 * GD 画像回転変換
 * argv : 1 : ソースファイル名, 2 : デストファイル名, 3 : 角度
 */
// 引数取得 //
$srcfnm = $argv[1];
$dstfnm = $argv[2];
$degree = $argv[3];

// 画像タイプ取得 //
list($src_width, $src_height, $type) = getimagesize($srcfnm);

switch ($type) {
  case IMAGETYPE_JPEG:    // 2
    $im = imagecreatefromjpeg($srcfnm);
    break;
  case IMAGETYPE_PNG:     // 3
    $im = imagecreatefrompng($srcfnm);
    break;
  case IMAGETYPE_GIF:     // 1
    $im = imagecreatefromgif($srcfnm);
    break;
}

// ++ 回転して保存 ++ //
$res = 1;
if ($im) {
  // 回転 //
  //$degree = $degree * -1;
  $rotate = imagerotate($im, $degree * -1, 0);   // 0 は余白色
  // 保存 //
  if ($type == IMAGETYPE_JPEG) {
    imagejpeg($rotate, $dstfnm);
  }
  else if ($type == IMAGETYPE_PNG) {
    imagepng($rotate, $dstfnm);
  }
  else {
    imagegif($rotate, $dstfnm);
  }
}
else {
  $res = 0;
}

// メモリの開放 //
imagedestroy($im);
imagedestroy($rotate);

// 連想配列に格納 //
$responce = [];
$responce["Degree"] = (int)$degree;
$responce["Result"] = $res;

// 処理結果をJSONに変換して出力 //
echo json_encode($responce, JSON_PRETTY_PRINT);

?>


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

[ コード例 ]


<?php

/**
 * GD 画像灰色セピア変換
 * argv : 1 : ソースファイル名, 2 : デストファイル名, 3 : セピア or Not
 */
// 引数取得 //
$srcfnm = $argv[1];
$dstfnm = $argv[2];
$flgsepia = $argv[3];

// 画像タイプ取得 //
list($src_width, $src_height, $type) = getimagesize($srcfnm);

switch ($type) {
  case IMAGETYPE_JPEG:    // 2
    $im = imagecreatefromjpeg($srcfnm);
    break;
  case IMAGETYPE_PNG:     // 3
    $im = imagecreatefrompng($srcfnm);
    break;
  case IMAGETYPE_GIF:     // 1
    $im = imagecreatefromgif($srcfnm);
    break;
}

// 変換して保存 //
$res = 1;
//if ($im && imagefilter($im, IMG_FILTER_GRAYSCALE)) {
if ($im) {
  // セピア //
  if ($flgsepia == 1) {
    //imagefilter($im, IMG_FILTER_COLORIZE, 255, 50, 50);
    //imagefilter($im, IMG_FILTER_COLORIZE, 100, 0, 0);
    //imagefilter($im, IMG_FILTER_COLORIZE, 255, 0, 0);
    //imagefilter($im, IMG_FILTER_COLORIZE, 128, 50, 50);
    imagefilter($im, IMG_FILTER_GRAYSCALE);
    imagefilter($im, IMG_FILTER_COLORIZE, 100, 50, 0);
    // https://www.phpied.com/image-fun-with-php-part-2/ これを真似る
    
  }
  // 白黒 //
  else {
    imagefilter($im, IMG_FILTER_GRAYSCALE);
  }
  if ($type == IMAGETYPE_JPEG) {
    imagejpeg($im, $dstfnm);
  }
  else if ($type == IMAGETYPE_PNG) {
    imagepng($im, $dstfnm);
  }
  else {
    imagegif($im, $dstfnm);
  }
}
else {
  $res = 0;
}

imagedestroy($im);

// 連想配列に格納 //
$responce = [];
$responce["Sepia"] = (int)$flgsepia;
$responce["Result"] = $res;

// JSONに変換して出力 //
echo json_encode($responce, JSON_PRETTY_PRINT);

?>

セピア変換はここで教えていただきました : https://www.phpied.com/image-fun-with-php-part-2/

http://kyasper.com/php-tips/

マニュアル : https://php.plus-server.net/function.imagefilter.html