1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php
/* ----------------------------------------------------------------------------------
 *  [ ImageMagickを利用した画像の合成(重ね合わせ) ] のサンプル
 *  ベース画像に対して、ロゴなどう画像を重ね合わせて合成画像出力する内容
 *  --------------
 *  compositeImage( $imagick_obj , $compose , $x , $y [,$channel]);
     @imagick_obj : 合成する画像のImagick オブジェクト
     @compose     : 合成演算子
     @x           : 合成する位置: X 座標
     @y           : 合成する位置: Y 座標
     @channel     : チャネルモードで使用可能なチャネル定数を指定
 *
 * 2016.08.25 作成 Yoshi of CXMedia Inc.
 * ---------------------------------------------------------------------------------- */
// ベース画像と合成する画像のパス設定
$img_base 'img_sample/Base_image.jpg';
$img_logo 'img_sample/Sample_logomark.png';

// ベース画像パスから出力ファイル名の設定
list($base_path,$img_exit) = file2path_ext_get($img_base);
$img_out $base_path.'_comsite.'.$img_exit;

// ベース画像のImageMagickのコンストラクタからインスタンスの作成
$imgbase_obj = new Imagickrealpath($img_base) );
// ベース画像の縦横サイズの取得
$basesize $imgbase_obj->getImagePage();

// 合成する画像のImageMagickのコンストラクタからインスタンスの作成
$imglogo_obj = new Imagickrealpath($img_logo) );
// 合成する画像の縦横サイズの取得
$logo_size $imglogo_obj->getImagePage();

// 合成位置の編集(gravityとoffset指定)
$offset   'SW:40:-40';
list(
$start_x,$start_y) = ImageGravityPage($basesize,$logo_size,$offset);

// 画像合成の処理
$imgbase_obj->compositeImage$imglogo_obj,Imagick::COMPOSITE_DEFAULT,$start_x,$start_y );
// 合成する画像のオブジェクト開放(破棄)
$imglogo_obj->clear();   // destroy()が非推奨のため、clear()を利用

// 指定した名前で画像の出力:(PHP5.3以降とPHP5.2の出力処理判断)
imageWrite($imgbase_obj,$img_out);

echo 
"<img src=\"$img_out\" width=\"920\" alt='編集した合成画像'>";

exit;

/* ----------------------------------------------------------------------------------
 *  ---- gravity指定とオフセット位置から開始位置の設定 ----
 *  @basesize : 背景又はベースとなる画像サイズ:[width],[height]の指定
 *  @opesize  : 処理したい画像サイズ:[width],[height]の指定
 *  @offset   : gravity:オフセットの[幅]:[高さ]の指定
                NWの位置を(0,0)とし、gravityに対する+,-値で指定
              : gravityの指定
                省略:NW,N,NE,E,W,C,SW,S,SEの利用可
 * ------------[gravity]と[offset]のサンプル指定(いずれも中心画像のトリミング)-----
 * Gravity   offset   + Gravity   offset   + Gravity   offset   + Gravity   offset
 *   E     '-150x-50' |    W    '150x-50'  |   N     '0x50'     |   S      '0x-200'
 *   NE    '-150x50'  |    NW   '150x50'   |   SE    '-150x-200'|   SW     '150x-200'
 *   C     '0x0'      |
 * ---------------------------------------------------------------------------------- */
function ImageGravityPage($basesize,$opesize,$offset){
    
// オフセットサイズの分解
    
list($gravity,$offset_x,$offset_y) = explode(':',$offset);
    
// ベース画像とトリミング画像の半分のサイズ計算
    
$base_half_x = (int)($basesize['width'] / 2);
    
$base_half_y = (int)($basesize['height'] / 2);
    
$new_half_x  = (int)($opesize['width'] / 2);
    
$new_half_y  = (int)($opesize['height'] / 2);

    
// gravity判断から開始位置のセット
    
if($gravity=='northwest' || $gravity=='NW'){
        
$start_x $offset_x;
        
$start_y $offset_y;
    }elseif(
$gravity=='north' || $gravity=='N'){
        
$start_x = ($base_half_x $new_half_x) + $offset_x;
        
$start_y $offset_y;
    }elseif(
$gravity=='northeast' || $gravity=='NE'){
        
$start_x = ($basesize['width'] - $opesize['width']) + $offset_x;
        
$start_y $offset_y;
    }elseif(
$gravity=='east' || $gravity=='E'){
        
$start_x = ($basesize['width'] - $opesize['width']) + $offset_x;
        
$start_y = ($base_half_y $new_half_y) + $offset_y;
    }elseif(
$gravity=='west' || $gravity=='W'){
        
$start_x $offset_x;
        
$start_y = ($base_half_y $new_half_y) + $offset_y;
    }elseif(
$gravity=='center' || $gravity=='C'){
        
$start_x = ($base_half_x $new_half_x) + $offset_x;
        
$start_y = ($base_half_y $new_half_y) + $offset_y;
    }elseif(
$gravity=='southwest' || $gravity=='SW'){
        
$start_x $offset_x;
        
$start_y = ($basesize['height'] - $opesize['height']) + $offset_y;
    }elseif(
$gravity=='south' || $gravity=='S'){
        
$start_x = ($base_half_x $new_half_x) + $offset_x;
        
$start_y = ($basesize['height'] - $opesize['height']) + $offset_y;
    }elseif(
$gravity=='southeast' || $gravity=='SE'){
        
$start_x = ($basesize['width'] - $opesize['width']) + $offset_x;
        
$start_y = ($basesize['height'] - $opesize['height']) + $offset_y;
    }else{
        echo 
'gravityのパラメータ指定エラー';
        exit;
    }
    return array(
$start_x,$start_y);
}

/* ---------------------------------------------------------------
 *  PHPバージョンにより、writeImageFile/writeImage関数の出力処理
 *  @img_obj     : Imagemagickのインスタンス
 *  @img_outpath : 出力画像の画像タイプ(拡張子)つきパス
 * --------------------------------------------------------------- */
function imageWrite($img_obj,$img_outpath){
    
// PHPバージョンにより処理を区別
    
$php_ver_ary explode('.'PHP_VERSION); // PHP_VERSIONは定数
    
$php_version sprintf("%d%02d",$php_ver_ary[0],$php_ver_ary[1]);
    
    
// 指定した名前で画像の出力:PHP5.3以降とPHP5.2の処理分岐
    
if($php_version >= '503'){
        
//--PHP5.3以降は、 writeImageFileで対応--
        
$img_obj->writeImageFile(fopen($img_outpath,'wb'));
    } else {
        
// --PHP5.2は、OK →PHP5.3以降 writeImage()のエラー
        
$img_obj->writeImage($img_outpath);
    }
}

/* ------------------------------------------#
 *  ファイル名(パス)と拡張子を分離してget
 * ----------------------------------------- */
function file2path_ext_get($str){
    
preg_match("/(.*)\.(.+?)$/",$str,$result);
    if(isset(
$result[2])){return array($result[1],strtolower($result[2]));}
}
?>