【问题标题】:PHP ImagickDraw with outlined text issues带有概述文本问题的 PHP ImagickDraw
【发布时间】:2012-12-12 13:08:28
【问题描述】:

我正在学习和练习我的 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 笔画的一些问题。在大字体上,它看起来不错,但对于较小的字体,笔画和字体会出现一些问题。

【问题讨论】:

    标签: php imagemagick image-manipulation imagick


    【解决方案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();
    

    【讨论】:

    • 太棒了。非常感谢您的时间。现在我明白了这些东西,我知道我在尝试重新缩放和调整大小时做错了什么;)
    【解决方案2】:

    您能否发布您的结果或更具体地说明您认为不合适的地方?

    一种解决方案可能是首先在透明背景上创建文本(带有笔划),然后将其合成到图像上。您可以创建更大字体大小的文本并调整大小以使其在最终图像上看起来更平滑。

    【讨论】:

    • +1。将 PHP 生成的图像放大(比如 600%),然后将其重新调整为正确的尺寸,这是一种经过验证的像素边缘和抗锯齿效果不佳的解决方案。
    • @Lukas Nagel 我已经更新了我的问题并提供了一个示例。
    • @Daniel 重新缩放图像并调整其大小并不能解决我的问题。我按照建议将图像放大 600%,然后将图像调整为正确的尺寸。提示?
    • 使用更大的字体大小,然后按比例缩小。还尝试使用黑色字体创建轮廓,然后在其上合成白色字体。你用什么字体,我自己试试看?
    • 愚蠢的问题,影响。我会试一试,然后告诉你。
    猜你喜欢
    • 2017-08-24
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多