PHP GD 画像ファイル合成

[ コード例 ]


<?php

/**
 * GD 合成位置指定画像ファイル合成 
 * argv : 1:ファイル名A(背景), 2:ファイル名B(パネル), 3:生成ファイル名, 
 *        4:合成位置 (N, NE, E, SE, S, SW, W, NW, C), 5:パッディング (オプション) 
 */

// 引数取得 //
$fnm_a = $argv[1];
$fnm_b = $argv[2];
$fnm_new = $argv[3];
$mrglocation = $argv[4];
$PADDING = isset($argv[5]) ? $argv[5] : 12;   // 指定がない場合は12ピクセル

// Linux 引数の" が認識されてない対策 //
$fnm_a = str_replace("^", " ", $fnm_a);
$fnm_b = str_replace("^", " ", $fnm_b);
$fnm_new = str_replace("^", " ", $fnm_new);

// A, B画像サイズ, 画像タイプ取得 //
list($a_width, $a_height, $type_a) = getimagesize($fnm_a);
list($b_width, $b_height, $type_b) = getimagesize($fnm_b);

// 対象イメージ格納 //
switch ($type_a) {
  case IMAGETYPE_JPEG:    // 2
    $image_a = imagecreatefromjpeg($fnm_a);
    break;
  case IMAGETYPE_PNG:     // 3
    $image_a = imagecreatefrompng($fnm_a);
    break;
  case IMAGETYPE_GIF:     // 1
    $image_a = imagecreatefromgif($fnm_a);
    break;
}
switch ($type_b) {
  case IMAGETYPE_JPEG:    // 2
    $image_b = imagecreatefromjpeg($fnm_b);
    break;
  case IMAGETYPE_PNG:     // 3
    $image_b = imagecreatefrompng($fnm_b);
    break;
  case IMAGETYPE_GIF:     // 1
    $image_b = imagecreatefromgif($fnm_b);
    break;
}

// コピー先の画像,コピー元の画像,コピー先のx座標,コピー先のy座標,コピー元のx座標,コピー元のy座標,コピー元の幅,コピー元の高さ //
// 合成する //
switch ($mrglocation) {
  case "NW":   // 左上
    imagecopy($image_a, $image_b, $PADDING, $PADDING, 0, 0, $b_width, $b_height);
    break;
  case "NE":   // 右上
    imagecopy($image_a, $image_b, $a_width - $b_width - $PADDING, $PADDING, 0, 0, $b_width, $b_height);
    break;
  case "SE":   // 右下
    imagecopy($image_a, $image_b, $a_width - $b_width - $PADDING, $a_height - $b_height - $PADDING, 0, 0, $b_width, $b_height);
    break;
  case "SW":   // 左下
    imagecopy($image_a, $image_b, 12, $a_height - $b_height - $PADDING, 0, 0, $b_width, $b_height);
    break;

  case "N":    // 上中央
    imagecopy($image_a, $image_b, $a_width / 2 - $b_width / 2, $PADDING, 0, 0, $b_width, $b_height);
    break;
  case "S":    // 下中央
    imagecopy($image_a, $image_b, $a_width / 2 - $b_width / 2, $a_height - $b_height - $PADDING, 0, 0, $b_width, $b_height);
    break;
  case "E":    // 右中央
    imagecopy($image_a, $image_b, $a_width - $b_width - $PADDING, $a_height / 2 - $PADDING / 2, 0, 0, $b_width, $b_height);
    break;
  case "W":    // 左中央
    imagecopy($image_a, $image_b, $PADDING, $a_height / 2 - $PADDING / 2, 0, 0, $b_width, $b_height);
    break;
  case "C":    // 中央中央
    imagecopy($image_a, $image_b, $a_width / 2 - $b_width / 2, $a_height / 2 - $b_height / 2, 0, 0, $b_width, $b_height);
    break;
  }


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

// 解放 //
imagedestroy($image_a);
imagedestroy($image_b);

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

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

?>


[ 利用例 ]

Aファイル (背景)

Bファイル (パネル)

合成結果 NE パディング指定あり

合成結果 SE

合成結果 SW

合成結果 NW

合成結果 S