100) $step = 100; # 入力されたテキスト (テストなので最大6文字の制限) $text = substr((string)$_GET['text'],0,6); # 生成する画像の高さ (ここでは高さを300pxに固定) $unit = 300; # 作業用ディレクトリー (好きな場所に設定可。パーミッションに注意) $tmp = '../tmp'; # タイル用の画像を置くディレクトリー $dir = '../Photo/tile'; # 生成するファイル $fileName = ''; # 生成にかかった時間 $dt = ''; if ( $text!='' && !preg_match("/\W/",$text) ) { # セキュリティの都合で半角英数字のみに制限 # プロポーショナルフォントだと1文字の幅の決め方が難しい…「w」の横幅が長くて生成した画像が切れてしまうので、適宜修正 $size = array('height'=>$unit,'width'=>3*$unit*strlen($text)/4); $p_font = array('x'=>round($unit/4/3),'y'=>round(3*$size['height']/4)); # 解析にかかる時間を測定するため現在の時刻をマイクロ秒まで取得 $t = microtime(true); # 入力されたテキストを仮の画像にする $img = imagecreate($size['width'],$size['height']); $white = imagecolorallocate($img,255,255,255); imagecolortransparent($img,$white); imagepng($img,"$tmp/empty_white.png"); chmod("$tmp/empty_white.png",0775); exec("convert -font '$font' -fill '#ffffff' -pointsize {$size['height']} -draw \"text {$p_font['x']},{$p_font['y']} '".addslashes($text)."'\" '$tmp/empty_white.png' '$tmp/empty.png'"); chmod("$tmp/empty.png",0775); # バックグラウンドの画像を生成 $img = imagecreate($size['width'],$size['height']); $white = imagecolorallocate($img,255,255,255); $black = imagecolorallocate($img,0,0,0); imagepng($img,"$tmp/backimage.png"); chmod("$tmp/backimage.png",0775); # 文字に出す画像を収集 $files = array(); $fh = dir($dir); while ($_=$fh->read()) if (strpos($_,'.')!==0) $files[] = "$dir/$_"; # 収集した画像をタイル上に貼り付けて、そのデータを保存 $img = imagecreatetruecolor($size['width'],$size['height']); $p = array('x'=>0,'y'=>0); while ($p['y']<=$size['height']) { $p['x'] = 0; while ($p['x']<=$size['width']) { $file = $files[array_rand($files)]; $o = imagecreatefromjpeg($file); $s = getimagesize($file); $min = min($s[0],$s[1]); # imagecopy($img,$o,$p['x'],$p['y'],0,0,$step,$step); imagecopyresampled($img,$o,$p['x'],$p['y'],($s[0]-$min)/2,($s[1]-$min)/2,$step,$step,$min,$min); $p['x'] += $step; } $p['y'] += $step; } imagepng($img,"$tmp/back.png"); chmod("$tmp/back.png",0775); # 上の方で保存したファイルを合成 exec("composite -compose in '$tmp/back.png' '$tmp/empty.png' '$tmp/tmp.png'"); chmod("$tmp/tmp.png",0775); $fileName = "$tmp/".md5($text.microtime(true)).'.png'; exec("composite -compose over '$tmp/tmp.png' '$tmp/backimage.png' '$fileName'"); chmod($fileName,0775); # 解析にかかった時間を算出 $dt = microtime(true) - $t; } ?>  PHPとGDを使って複数の画像でできたモザイク画像の文字を作る

タイル状に並べた画像を文字のところだけ抜きます。オリジナルのIBMではPerlとGDが使われていますが、そのPHP版を作りました。

タイル状に並べた画像を<?=htmlspecialchars($text)?>の文字のところだけ抜いた画像
生成にかかった時間 :
生成例
タイル状に並べた画像をAaの文字のところだけ抜いた画像
Text(6文字までの半角英数字) : Step(10-100):

動作に必要なこと・もの

更新履歴
2011/05/19
このページを作成して公開する。
2015/02/21
パーミッションの変更と変数の初期化を追加する。
2015/05/10
ImageMagickに関する記述を追加し、初期画面でサンプルを表示する。