3

私はImagickのスキルを学び、実践しています。

Imagickストロークを使用したアウトラインテキストに問題があります。私はこの画像に見える効果を達成したいと思います:人気のあるインターネットミーム:

ここに画像の説明を入力してください

これが私がこれまでに持っているコードです:

$draw = new \ImagickDraw();
$outputImage = new \Imagick('meme.jpg');

$draw->setFillColor('#fff');
$draw->setFont('impact.ttf');
$draw->setFontSize(40);
$draw->setGravity(\Imagick::GRAVITY_NORTH);
$draw->setStrokeColor('#000');
$draw->setStrokeWidth(1);
$draw->setStrokeAntialias(true);
$draw->setTextAntialias(true);

$outputImage->annotateImage($draw, 0, 5, 0, 'Sample text');

$outputImage->setFormat('png');
$outputImage->writeimage('tmp/meme.png');

問題:テキストストロークが見栄えがよくありません。Imagickディスカッション掲示板で、画像に2回注釈を付けることについてのヒントを見つけましたが、ストロークはありません。動作しません。

画像を書く前に:

   $draw->setStrokeColor('transparent');
   $outputImage->annotateImage($draw, 0, 5, 0, 'Sample text');

誰かが私に手がかりを与えることができますか?

更新
結論として、生成された画像は次のようになります。

ここに画像の説明を入力してください

ご覧のとおり、異なるフォントサイズを使用しているときに、2pxのストロークでいくつかの問題が発生します。大きなフォントでは見栄えがしますが、小さなフォントではストロークとフォントにいくつかの問題があります。

4

2 に答える 2

4

Version1: リサイズ

ここに画像の説明を入力

バージョン 2: 合成とサイズ変更

ここに画像の説明を入力

バージョン 2 では、はるかに優れた結果が得られます。以下のコードを参照してください。サイズ変更によって望ましくない効果が生じる可能性があるため、最終的なサイズによっては、フォントとストロークのサイズをいじる必要があります。サイズを変更せずにバージョン 2 を試すこともできます。

バージョン 1: サイズ変更

$draw = new ImagickDraw();
$draw->setFillColor('#fff');
$draw->setFont('impact.ttf');
$draw->setFontSize(100); //use a large font-size
$draw->setStrokeColor('#000');
$draw->setStrokeWidth(4);
$draw->setStrokeAntialias(true);  //try with and without
$draw->setTextAntialias(true);  //try with and without
$outputImage = new Imagick();
$outputImage->newImage(1400,400, "transparent");  //transparent canvas
$outputImage->annotateImage($draw, 20, 100, 0, 'STOP ME FROM MEMEING');
$outputImage->trimImage(0); //Cut off transparent border
$outputImage->resizeImage(300,0, imagick::FILTER_CATROM, 0.9, false); //resize to final size
/*
Now you can compositve over the image
*/
//Clean up
$draw->clear();
$draw->destroy();
$outputImage->clear();
$outputImage->destroy();

バージョン 2: 合成とサイズ変更

$draw = new ImagickDraw();
$draw->setFont('impact.ttf');
$draw->setFontSize(100); //use a large font-size
$draw->setStrokeAntialias(true);  //try with and without
$draw->setTextAntialias(true);  //try with and without

//Create text  
$draw->setFillColor('#fff');
$textOnly = new Imagick();
$textOnly->newImage(1400,400, "transparent");  /transparent canvas
$textOnly->annotateImage($draw, 21, 101, 0, 'STOP ME FROM MEMEING');  //parameters depend of stroke and text size
//Create stroke
$draw->setFillColor('#000'); //same as stroke color
$draw->setStrokeColor('#000');
$draw->setStrokeWidth(8);
$strokeImage = new Imagick();
$strokeImage->newImage(1400,400, "transparent");
$strokeImage->annotateImage($draw, 20, 100, 0, 'STOP ME FROM MEMEING');

//Composite text over stroke
$strokeImage->compositeImage($textOnly, imagick::COMPOSITE_OVER, 0, 0, Imagick::CHANNEL_ALPHA );
$strokeImage->trimImage(0);  //cut transparent border
$strokeImage->resizeImage(300,0, imagick::FILTER_CATROM, 0.9, false); //resize to final size
/*
Now you can compositve over the image
*/
//Clean up
$draw->clear();
$draw->destroy();
$strokeImage->clear();
$strokeImage->destroy();
$textOnly->clear();
$textOnly->destroy();
于 2012-12-13T11:09:37.263 に答える
1

結果を投稿していただけますか。

解決策として、最初に透明な背景に (ストロークを使用して) テキストを作成し、それを画像の上に合成することが考えられます。テキストを大きなフォント サイズで作成し、サイズを変更して、最終的な画像でより滑らかに見えるようにすることができます。

于 2012-12-12T14:34:42.193 に答える