MagickWandおよびGDライブラリを使用したテキストと画像のオーバーレイ

MagickWandは、PHPで画像を操作するためにImageMagicソフトウェアパッケージにアクセスするライブラリの1つです。 テキストとグラフィックスオーバーレイの機能を検討してください。 ImageMagicは非常に高速で、より良い品質の結果を生成すると言われています(ただし、GDほど一般的ではありません)。 これを確認します。

一般的なスクリプトコードは次のようになります。

$new_image = NewMagickWand(); //  MagickWand MagickReadImage($new_image, 'image.png'); //     $w = MagickGetImageWidth($new_image); //   $h = MagickGetImageHeight($new_image); /* ---   --- */ MagickSetImageFormat($new_image, 'jpeg'); MagickWriteImage($new_image, 'newimage.jpeg'); //  // ClearMagickWand($new_image); //       DestroyMagickWand($new_image); 


次に、画像処理コードを詳しく見てみましょう。 例として、写真にテキストの著作権を課します。 これを行うには、いくつかの方法があります。

1. MagickCompositeImageを使用して、事前に準備された半透明の著作権画像を適用します

 $watermark = NewMagickWand(); MagickReadImage($watermark, 'copyright.png'); //   $wc = MagickGetImageWidth($watermark); $hc = MagickGetImageHeight($watermark); MagickCompositeImage($new_image, $watermark, MW_OverCompositeOp, $w-$wc, $h-$hc); //     ClearMagickWand($watermark); //      DestroyMagickWand($watermark); 


2. DrawCompositeを使用して、事前に準備された半透明の著作権画像を適用します

 $watermark = NewMagickWand(); MagickReadImage($watermark, 'copyright.png'); $watermark_drawing = NewDrawingWand(); //  DrawingWand   DrawSetGravity($watermark_drawing, MW_SouthEastGravity); //       DrawComposite($watermark_drawing, MW_OverCompositeOp, 0, 0, 0, 0, $watermark); //    MagickDrawImage($new_image, $watermark_drawing); //     ClearMagickWand($watermark); DestroyMagickWand($watermark); ClearDrawingWand($watermark_drawing); DestroyDrawingWand($watermark_drawing); 

これらの2つの方法の結果は次のとおりです。

画像

ランタイムも同様です。 最初のケースでは、20ミリ秒から400ミリ秒にジャンプします。 200ミリ秒の抽象的な平均を取ります。 2番目の場合、画像サイズやその他の要因に実質的に依存せず、160ミリ秒になります。

3. MagickAnnotateImageを使用して著作権テキストとオーバーレイを生成する

 //   $watermark_drawing = NewDrawingWand(); DrawSetFont($watermark_drawing, 'copyright.ttf'); DrawSetFontSize($watermark_drawing, 12); DrawSetGravity($watermark_drawing, MW_NorthWestGravity); //   $pixel_wand = NewPixelWand(); PixelSetColor($pixel_wand, 'black'); PixelSetOpacity($pixel_wand, 0.6); DrawSetFillColor($watermark_drawing, $pixel_wand); //        MagickAnnotateImage($new_image, $watermark_drawing, $w-15, $h-8, -90,' '); ClearDrawingWand($watermark_drawing); DestroyDrawingWand($watermark_drawing); 


4.同じことですが、DrawAnnotationを使用します

 $watermark_drawing = NewDrawingWand(); DrawSetFont($watermark_drawing, 'copyright.ttf'); DrawSetFontSize($watermark_drawing, 12); DrawSetGravity($watermark_drawing, MW_NorthWestGravity); DrawRotate($watermark_drawing, -90); $pixel_wand = NewPixelWand(); PixelSetColor($pixel_wand, 'black'); PixelSetOpacity($pixel_wand, 0.6); DrawSetFillColor($watermark_drawing, $pixel_wand); DrawAnnotation($watermark_drawing, 8-$h, $w-15, ' '); //    . // ,     90°     «»,      MagickDrawImage($new_image, $watermark_drawing); ClearDrawingWand($watermark_drawing); DestroyDrawingWand($watermark_drawing); 

これらの2つの方法の結果は次のとおりです。

画像

碑文は少し明確ですが、Photoshopが最初の方法ではソースファイルのテキストをぼかしすぎていることを示しています。

速度の方法は同じです。 時間は大幅にスキップします。 小さな画像の場合、20msであり、2560×1600で300msに達します。 150の平均値を取ります。ここでも、抽象的です。

結論:MagickWandで著作権を挿入する最良の方法は、DrawCompositeを使用することです。 それは普遍的で(テキストだけでなく挿入可能)、予測可能な時間に機能します。 彼の元の画像は3つまたは4つの方法で準備できます。

GD Graphics Libraryは 、どのサーバーにもある可能性があります。 その中で、次のように同じことができます。

 list($w, $h) = getimagesize('image.png'); //    $new_image = imagecreatefrompng('image.png'); //   /* ---   --- */ imagejpeg($new_image, 'newimage.jpeg') // imagedestroy($new_image); 


1.準備されたイメージを使用する

 list($cw, $ch) = getimagesize('copyright.png'); $watermark = imagecreatefrompng('copyright.png'); imagecopy($new_image, $watermark, $w-$cw, $h-$ch, 0, 0, $cw, $ch); //  imagedestroy($watermark); //  


画像

2. GDを使用したテキスト生成

 $color = imagecolorallocatealpha($new_image, 0, 0, 0, 60); //     60% imagettftext($new_image, 10, 90, $w-7, $h-12, $color, 'copyright.ttf', ' '); //        


画像

最初の場合の動作時間は、画像サイズに応じて0.2〜0.7ミリ秒で、2番目の場合は30%長くなりました。

率直に言って、GDがほぼ1000倍高速に動作するのを見て驚いた。 確かに、他の形式を開いたり、保存したり、変換したりせずに測定したのは、画像処理アルゴリズムでした。 また、占有メモリの量を考慮しなかったため、データは実際の使用には適していません。 さまざまなタイプのファイルを使用して関数全体のパフォーマンスを測定すると、GDが小さなファイルで最大10倍高速に動作することがわかりました。 ライブラリは、最も一般的なサイズ(3〜8メガピクセル)を同じ速度で処理します(ホスティングでのみ有効)。 MagickWand(ImageMagic)は、最高のズーム品質で人気があります。 繰り返しますが、これは複雑な写真にのみ当てはまります。 明確な輪郭MWブラーも

画像画像

興味深いことに、このようなPNG画像(右側)の重みは、GDの6 KBに対して1.2 KBでした。 そして、GDがパレットを8ビットに変更することを推測しなかったという事実からすべてです。

したがって、ホスティングの速度を確認し(McHostでテストしました)、ニーズに基づいて品質を選択し、その後特定のライブラリを優先するか、むしろコインを投げます;-)

ボーナス
品質設定について少し

MagickWandでは、保存する前に品質設定が設定されます

 MagickSetImageCompressionQuality($new_image, $quality); MagickSetImageFormat($new_image, 'jpeg'); MagickWriteImage($new_image, 'newimage.jpeg'); //  

ここで、jpegの0〜100およびpngの0〜80の$品質の圧縮率。 gifは影響を受けません。
jpegの場合:
0、null-デフォルトの圧縮〜85
1..100-ひどい品質から完璧へのグラデーション

pngの場合、品質を損なうことのない形式であるため、画像の重みと、それに応じてサーバーによって処理される時間のみに影響します
0、null-デフォルトの圧縮が最高です(この場合、画像の重みは最小です)
1..80-低圧縮率から高圧縮率へのグラデーション(ただし、最大圧縮率は0)

MagickWandでも圧縮のタイプを指定できますが、jpeg、png、gifの場合、何にも影響しません。
MagickSetImageCompression($画像、MW_JPEGCompression);

GDでは、保存機能で品質が設定されます

 imagejpeg($new_image, 'newimage.jpeg', $quality) imagepng($new_image, 'newimage.png', $quality) imagegif($new_image, 'newimage.gif') //gif    

ここで、jpegの0〜100およびpngの0〜9の$品質の圧縮率。
jpegの場合:
null-デフォルトの圧縮は75
0..100-ひどい品質から完璧なグラデーション。 MagickWandとほぼ同じ

pngの場合:
null-デフォルトの圧縮は0(低圧縮)
0..9-低から高圧縮率へのグラデーション。 値が9の場合、画像の重みはMagickWandの0とほぼ同じです。

Source: https://habr.com/ru/post/J159209/


All Articles