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