2017-05-31 9 views
0

私は、異なるレイヤ(イメージ)を1つのイメージにマージして生成したイメージをクライアントに表示することで、クライアントが動的イメージを作成できるプロジェクトに取り組んでいます。現在、私のコードは私の上記のコードでこのイメージをRAMに保存してImageMagickを使って作業する

$output = uniqid().'.jpg'; 
exec('convert -size 600x800 xc:white '.$output); 
$layers = array(//array of about hundreds of PNG images); 
foreach($layers as $key => $singleLayer) 
{ 
    $layerIs = $singleLayer['image']; 
    $positionsXY = explode(',', $singleLayer['xy']); 
    exec('composite -geometry +'.$positionsXY[0].'+'.$positionsXY[1].' '.$layerIs.' '.$output.' '.$output); 
} 
$base64 = base64_encode(file_get_contents($output)); 
unlink($output); 
return 'data:image/jpeg;base64,'.$base64; 

のようなものですが、私は白の背景画像を生成し、その後もシングルこの画像ごとに時間を節約しながら、これらの画像は、100以上のもの、その上に複数のPNG画像をマージしています生成されたイメージを削除した後、最終イメージをクライアントに出力する。これはすべて約15秒かかります。

ImageMagickには、画像をハードディスクに保存する代わりにRAMに保存するオプションがありますが、これは自分の処理を高速化できますか?

私はこれを見つけましたが、それをどのように実装できるのか分かりませんでした。

+0

image magickのreadImageBlob関数を試してみることができます:http://php.net/manual/en/imagick.readimageblob.phpイメージのmagickオブジェクトの '__toString'メソッドを使用してイメージを変数。 – Jite

+0

@Jite ImageMagickでは賢明ではありません。あなたが気にしないなら、少しのコードで手の込んだことができるので、私はそれをより良く理解することができます。また、PHP手続き型言語ではなくImageMagickで作業するためにexec()コマンドを使用しています。それで変数を使うと混乱が起きるでしょう:( –

+0

私はimagemagickのためにphp拡張子を使うことをお勧めしますが、それは可能でしょうか? 'phpinfo()'をチェックしてインストールされているか確認してください。もう少し説明してください。 – Jite

答えて

1

ImageMagickをPHPで使用する最も簡単な方法は、ImageMagick拡張子&クラスを使用することです。 exec関数を使用することはお勧めしません。

まず画像を変換して変数に格納します。
あなたは可変に慣れていないと言いますが、自分のコードではあなたのように思えるかもしれません。
たとえば、$outputは可変です。変数には、出力が行われた後のイメージが含まれます(成功した場合)。

ここでは、レイヤーの配列に画像や画像のパスが含まれているかどうかを100%確信していませんが、そのパスを期待しています。

あなたの最初のexecコールは変換を行いますが、私はそれがネセサリーではないと思います。入力がないため、必要なものはすべて私が見ることのできる「白い画像」です。

$image = new Imagick(); 
$image->newImage(600, 800, "white"); 

あなたはその後、レイヤをループあなたがそうであるように、代わりのexecの使用:で、新しいイメージオブジェクトを作成し、正しいサイズとBG色で新しいイメージを作成し、それを行うために

foreach($layers as $key => $singleLayer) { 
    $layerIs = $singleLayer['image']; 
    $positionsXY = explode(',', $singleLayer['xy']); 
    // Each loop should load the image into a new imagemagick object, but we release it when the scope is exited. 
    $layer = new IMagick($layerIs); 
    $image->compositeImage($layer, Imagick::COMPOSITE_DEFAULT, $positionsXY[0], $positionsXY[1]); 
} 

をループが完了すると、$image変数は、あなたが望むようにあなたが返すことができる合成画像を、含まれています:あなたは上記で作成したImageMagickのイメージ

$image->setImageFormat('jpg'); 
return "data:image/jpeg;base64,{base64_encode($image)}"; 

注:コードは、ブラウザで直接テストおよび書かれていません。だから、書き直す必要があるかもしれません!

+0

素晴らしいです!あなたのコードはうまく動作しています。しかし、それはなぜパフォーマンスの点で違いが生じていないのですか?処理を完了するのに同じ15秒かかります。 –

+0

私は、実際のボトルネックは、画像の構成に使用するレイヤーの100'dsの読み込みであると思います。私はどのくらいの最適化が可能か、おそらく小さな画像や少ない画像を使用することで可能かどうかはわかりませんが、使用方法にはかなりの違いがあります。画像操作は通常非常に重労働なので、時間がかかるかもしれません。 – Jite

+0

あなたはその答えがその質問に答えたと感じるならば、それを正しいものとしてマークしてください。 – Jite

関連する問題