PHP GD 枠付文字パネルファイル生成機

[ コード例 ]


<?php

/**
 * GD 文字列パネル描画ファイル生成
 * argv : 1: 生成ファイル名,  2: 横サイズ 3: 縦サイズ 4: フォント色 5:背景色 6:枠色
 *        7: 枠サイズ
 *        8: 書込文字列 9: 文字サイズ 10 : 背景透明度 (0 - 127) (8-10 オプション)
 */

// == 引数取得 == //
$fnm = $argv[1];
$xsz = $argv[2];
$ysz = $argv[3];

// 色指定 //
$rgb_font = $argv[4];
$rgb_fill = $argv[5];
$rgb_frame = $argv[6];
//  isset($argv[10]) ? $argv[10] : "";

// 枠サイズ //
$frlen = $argv[7]; 

// 文字 //
$text = isset($argv[8]) ? $argv[8] : "";
$textsz = isset($argv[9]) ? $argv[9] : "";
$alpha = isset($argv[10]) ? $argv[10] : 0;

// Linux 引数の" が認識されてない対策 //
$text = str_replace("_", " ", $text);

// 引数を16進文字列に分解して配列に入れる //
$fontcols = explode(":", $rgb_font);
$fillcols = explode(":", $rgb_fill);
$framecols = explode(":", $rgb_frame);

// +++ 色文字列を数値に変換 +++ //
// ImageColorAllocate用に10進配列にする //
$fontdecs = [];
foreach ($fontcols as $col) {
  $fontdecs[] = hexdec($col);
}
$filldecs = [];
foreach ($fillcols as $col) {
  $filldecs[] = hexdec($col);
}
$framedecs = [];
foreach ($framecols as $col) {
  $framedecs[] = hexdec($col);
}


// 画像の新規生成 //
$img = imagecreate($xsz, $ysz);

# 色を作る #
// 文字 //
$imcol_font = ImageColorAllocate($img, $fontdecs[0], $fontdecs[1], $fontdecs[2]);
// 背景は透明度指定あり //
$imcol_fill = ImageColorAllocateAlpha($img, $filldecs[0], $filldecs[1], $filldecs[2], $alpha);
// 枠 //
$imcol_frame = ImageColorAllocate($img, $framedecs[0], $framedecs[1], $framedecs[2]);

# UTF8へ変換 #
$text = mb_convert_encoding($text, 'UTF-8', 'auto');

// フォント //
if (DIRECTORY_SEPARATOR == "/") {
  $font = "/usr/share/fonts/vlgothic/VL-Gothic-Regular.ttf";
}
else {
  $font = "C:\Windows\Fonts\msgothic.ttc";
}

// 背景を描画する //
/* img, x1, y1, x2, y2, color */
imagefilledrectangle($img, 0, 0, $xsz, $ysz, $imcol_fill);

// 枠線幅 //
imagesetthickness($img, $frlen);

// 文字を書き込む //
/* img, テキストサイズ, アングル, X, Y, color, font, text */
$textx = (int)($frlen) + (int)($textsz / 2);
$texty = (int)($frlen + $textsz) + (int)($textsz / 2);
ImageTTFText($img, $textsz, 0, $textx, $texty, $imcol_font, $font, $text);

// 枠を引く //
/* img, x1, y1, x2, y2, color */
imagerectangle($img, 0, 0, $xsz, $ysz, $imcol_frame);

// ファイルに出力 //
$filepath = pathinfo($fnm);
$ext = mb_strtolower($filepath['extension']);
$res = 1;
try {
  if ($ext === "jpg" || $ext === "jpeg") {
    imagejpeg($img, $fnm, 100);
  }
  else if ($ext === "png") {
    imagepng($img, $fnm, 9);
  }
  else if ($ext === "gif") {
    imagegif($img, $fnm, 100);
  }
}
catch (Exception $ex) {
  $res = 0;
}

// 解放 //
imagedestroy($img);

// 連想配列に格納 //
$responce = [];
$responce["Result"] = $res;

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

?>


[ 生成例 ]

      

PHP GD スケッチ風変換

[ コード例 ]

IMG_FILTER_MEAN_REMOVAL 以外の引数はありません。


<?php

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

// 画像タイプ取得 //
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_MEAN_REMOVAL);
}
else {
  $res = 0;
}

if ($type == IMAGETYPE_JPEG) {
  imagejpeg($im, $dstfnm);
}
else if ($type == IMAGETYPE_PNG) {
  imagepng($im, $dstfnm);
}
else {
  imagegif($im, $dstfnm);
}

// 解放 //
gedestroy($im);

// 連想配列に格納 //
$responce = [];
$responce["Result"] = $res;

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


ここで教えていただきました。http://kyasper.com/php-tips/

[ 利用例・変換前 ]

[ 利用例・変換後 ]

PHP 3カ月カレンダーコマンドライン

Windows で Linuxシェルコマンドが使える busybox を入れたので、cal コマンドを試していて、3カ月カレンダーにしてみたくなり、作ってみました。

Windowsでは、busybox をインストールする必要あります。
Linux は calコマンドを素直に使ってます。

[ コード例 ]


<?php

/**
 * 横並び3カ月カレンダーテキスト取得
 * argv : なし
 * Update : 2019-01-22
 * Author : H.Tanaka
 */

$nowy = (int)date("Y");
$nowm = (int)date("m");

$m0 = $nowm - 1;
$m1 = $nowm;
$m2 = $nowm + 1;

$y0 = $m0 == 0 ? $nowy - 1 : $ynowy;
$y1 = $nowy;
$y2 = $m2 == 13 ? $nowy + 1 : $nowy;

$m0 = $m0 == 0 ? 12 : $m0;
$m2 = $m2 == 13 ? 1 : $m2;

$yary = [$y0, $y1, $y2];
$mary = [$m0, $m1, $m2];


$cmd = "";
if (DIRECTORY_SEPARATOR == "/") {   // Linux
  $cmd = "cal";
}
else {                              // Windows
  $cmd = "busybox64 cal";
}

$pos = 0;
$restxtary = [];
foreach ($mary as $m) {
  
  $y = $yary[$pos];
  $ccmd = $cmd." ".$m." ".$y;
  //echo $ccmd."\n";
  
  $resrows = [];    // ここで初期化しないと前月に追加される
  exec($ccmd, $resrows);
  $restxtary[] = $resrows;
  
  $pos++;
  
}
//var_dump($restxtary);

// 横並び3カ月カレンダー //
$calentxt = "";
for ($i = 0; $i<8; $i++ ) {
  for ($j = 0; $j<3; $j++ ) {
    $tmp = str_pad($restxtary[$j][$i], 20). "   ";
    $calentxt .= $tmp;
  }
  $calentxt .= "\n";
}

echo $calentxt;

?>


[ 実行結果 ]

c:\phppathname>php CalText3MH.php
   December 2018           January 2019          February 2019
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
                   1          1  2  3  4  5                   1  2
 2  3  4  5  6  7  8    6  7  8  9 10 11 12    3  4  5  6  7  8  9
 9 10 11 12 13 14 15   13 14 15 16 17 18 19   10 11 12 13 14 15 16
16 17 18 19 20 21 22   20 21 22 23 24 25 26   17 18 19 20 21 22 23
23 24 25 26 27 28 29   27 28 29 30 31         24 25 26 27 28
30 31

busybox はこちら : https://busybox.net/about.html

[ 応用例 ]

GD を使って画像に書き込んでみる。

PHP GD 画像に文字列描画 (背景 枠線付)

PHP GD リファレンス

[ コード例 ]


<?php

/**
 * GD 画像 枠矩形描画付テキスト書き込み
 * argv : 1 : ソースファイル名, 2 : デストファイル名, 3 : 書込み文字列
 *        4 : フォント色, 5 : 背景色, 6 : フレーム色 (4-6 はオプショナル)
 */

// 引数取得 //
$srcfnm = $argv[1];
$dstfnm = $argv[2];
$text = $argv[3];

// 色指定 //
$rgb_font = $argv[4];
$rgb_fill = $argv[5];
$rgb_frame = $argv[6];

$rgb_font = !$rgb_font ? "00:00:ff" :  $rgb_font;     // フォント色 (既定は青)
$rgb_fill = !$rgb_fill ? "ff:ff:ff" :  $rgb_fill;     // 背景色 (既定は白)
$rgb_frame = !$rgb_frame ? "ff:00:00" :  $rgb_frame;  // 枠色 (既定は赤)

// 引数を16進文字列に分解して配列に入れる //
$fontcols = explode(":", $rgb_font);
$fillcols = explode(":", $rgb_fill);
$framecols = explode(":", $rgb_frame);


// +++ 色文字列を数値に変換 +++ //
// ImageColorAllocate用に10進配列にする //
$fontdecs = [];
foreach ($fontcols as $col) {
  $fontdecs[] = hexdec($col);
}
$filldecs = [];
foreach ($fillcols as $col) {
  $filldecs[] = hexdec($col);
}
$framedecs = [];
foreach ($framecols as $col) {
  $framedecs[] = hexdec($col);
}

//var_dump($filldecs);

// 画像サイズ取得 //
list($width, $height, $type) = getimagesize($srcfnm);
$rectx2 = (int) $width - 16;     // パネルの横幅

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

# 色を作る #
$imcol_font = ImageColorAllocate($img,  $fontdecs[0], $fontdecs[1], $fontdecs[2]);
$imcol_fill = ImageColorAllocate($img, $filldecs[0], $filldecs[1], $filldecs[2]);
$imcol_frame = ImageColorAllocate($img, $framedecs[0], $framedecs[1], $framedecs[2]);       


# UTF8へ変換 #
$text = mb_convert_encoding($text, 'UTF-8', 'auto');

// フォント //
if (DIRECTORY_SEPARATOR == "/") {
  $font = "/usr/share/fonts/vlgothic/VL-Gothic-Regular.ttf";
}
else {
  $font = "C:\Windows\Fonts\msgothic.ttc";
}
///usr/share/fonts/VL-Gothic-Regular.ttf


// 背景を描画する //
/* img, x1, y1, x2, y2, color */
imagefilledrectangle($img, 8, 8, $rectx2, 30, $imcol_fill);

// 枠線幅 //
imagesetthickness($img, 2);

// 枠を引く //
/* img, x1, y1, x2, y2, color */
imagerectangle($img, 8, 8, $rectx2, 30, $imcol_frame);


// 文字を書き込む //
$fsz = $width <= 500 ? 10 : 12;    // 横幅が少ない場合、フォントを小さくする
/* img, テキストサイズ, アングル, X, Y, color, font, text */
ImageTTFText($img, $fsz, 0, 12, 26, $imcol_font, $font, $text);
//ImageTTFText($img, 11, 0, 12, 26, $imcol_font, $font, $text);


//ImageJPEG($img, "133458_05Text4.jpg");
//ImageJPEG($img, $dstfnm);
// ファイルに出力 //
$res = 1;
try {
  if ($type == IMAGETYPE_JPEG) {
    imagejpeg($img, $dstfnm, 100);
  }
  else if ($type == IMAGETYPE_PNG) {
    imagepng($img, $dstfnm, 9);
  }
  else {
    imagegif($img, $dstfnm, 100);
  }
}
catch (Exception $ex) {
  $res = 0;
}

// 解放 //
imagedestroy($img);

// 結果返却 連想配列に格納 //
$responce = [];
$responce["SrcW"] = $width;
$responce["SrcH"] = $height;
$responce["FSize"] = $fsz;
$responce["Result"] = $res;

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

?>

PHP strpos() と strstr()

PHP で文字列が含まれるかどうかの判定で、Windows と Linux で挙動が違っていましたので、備忘録しておきます。
文字列が含まれるかどうかの判定は、strstr で行い、含まれる位置まで必要な場合は、strpos で行い、位置判定は型も判定する === と !== を使うべきで、 == は使わないことです。


<?php
	
function getColorConfig($spectxt) {

	$COLOR_CONFIG_D = "ff:ff:ff 00:86:00 cc:00:00";
	$COLOR_CONFIG_S = "ff:ff:ff e4:00:7f cc:00:00";


	if (strpos($spectxt, 'DEN ') !== false) {
  	  return $COLOR_CONFIG_D;
        }

	if (strpos($spectxt, 'SAN ') != false) {
          return $COLOR_CONFIG_S;
	}


	// 'SAN'で始まる文字列かどうかのチェック //
	/* Windows (Ver5.6) では意図したとおり動く 
         Linux (Ver7.1) では含まれてないと判定される 
         PHP の 0 は FALSE も意味するので
	*/
	if (strpos($spectxt, 'SAN ') == 0) {
          return $COLOR_CONFIG_S;
	}

	/* 試してないが、これは思った通りの動作をすると思う */
	if (strpos($spectxt, 'SAN ') === 0) {
          return $COLOR_CONFIG_S;
	}

	/* strpos() を strstr() に変更すれば、どちらでも意図した動作する */
	if (strstr($spectxt, 'DEN ')) {
          return $COLOR_CONFIG_D;
        }


	if (strstr($spectxt, 'SAN ')) {
          return $COLOR_CONFIG_S;
	}

} 

PHP 比較演算子 : http://php.net/manual/ja/language.operators.comparison.php

Qiita : https://qiita.com/kazu56/items/2c72d187438de07c2503

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

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);

?>

PHP jqGrid用JSON応答用コード

いちばん簡潔に書くと、以下のようになります。

[ コード例 ]


<?php  

try {
  
  // 接続定義 //
  $connect_db = "mysql:dbname=databasename;host=localhost;charset=utf8";
  $connect_user = '?????';
  $connect_passwd = '??????';

  //データベース接続
  $dbm = new PDO($connect_db, $connect_user, $connect_passwd);
  // 検索 //
  $stmt = $dbm->query($SQL);
  
  // JSONクラスのインスタンス化 //
  $responce = new stdClass();

  $i = 0;
  while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    foreach ($row as $fld => $val) {
       //echo $val."\n";
      $responce->rows[$i][$fld] = mb_convert_encoding($val, "UTF-8", "auto");
    }
    $i++;
  }

  // JSONに変換して出力 //
  echo json_encode($responce, JSON_PRETTY_PRINT);
  
} catch (Exception $ex) {
  var_dump($ex->getMessage());
}

// 切断 //
$dbm = null;

?>