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

?>

コメントを残す