PHP ImagickDraw与概括文本问题(PHP ImagickDraw with outlin

2019-08-03 23:20发布

我在学习和实践我的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讨论板上小费约标注图像第二次,但没有中风。 不工作。

写入图像之前:

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

任何人都可以给我一个线索?

更新
最后,我生成的图像看起来如下:

正如你所看到的,我有一些问题与2px的行程,而使用不同的字体大小。 在大字体,它看起来不错,但用较小的字体有一些问题与中风和字体。

Answer 1:

版本1:调整

版本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();


Answer 2:

你可以发表你的结果,或者更具体的东西看起来不罚款吗?

溶液可以是创建文本(脑卒中)首先在transaprent背景,然后复合它在图像上。 您可以创建在更大的字体大小的文本和调整,使其看起来更平滑的最终图像上。



文章来源: PHP ImagickDraw with outlined text issues