使用php中的imagefilter()使图像清晰

时间:2012-10-25 23:26:39

标签: php image image-processing fonts gd

使用imagefilter()功能是否有可能使图像更清晰?我正在使用imagettftext()为字体添加消除锯齿功能,字体看起来有点散焦。我喜欢让我的最终图像锐化,以便减少图像中字符周围的模糊。

不同的测试图像

  • 使用字体
    • 的Roboto-Thin.ttf
    • 的Roboto-Black.ttf

带有浅色字体的图像

我喜欢让我的字体看起来像它旁边的那些线。

enter image description here

带深色字体的图像

enter image description here

带有 - $ font_color的图片(一些网络资源建议将字体颜色值设为负值,这基本上会关闭抗锯齿)但在这种情况下字体看起来很难看。 (从左到右100关闭抗锯齿)

enter image description here

3 个答案:

答案 0 :(得分:2)

GD解决方案

$old = "old.png";
$new = "new.png";

$im = imagecreatefrompng($imgname);
imagetruecolortopalette($im, FALSE, 256);
imagecolorset($im, imagecolorclosest($im, 159, 159, 159), 0, 0, 0);
imagecolorset($im, imagecolorclosest($im, 191, 191, 191), 0, 0, 0);

imagepng($im, $new);
imagedestroy($im);

Image Magic Solution

convert old.png -fuzz 0% -fill rgb(0,0,0) -opaque rgb(159,159,159) new.png
convert new.png -fuzz 0% -fill rgb(0,0,0) -opaque rgb(191,191,191) new.png


他们会输出

enter image description here enter image description here

                  Old                           new

答案 1 :(得分:2)

imagefilter()中没有这样的过滤器(你确实试过IMG_FILTER_EDGEDETECT?对于急剧过渡,它可能会给你带来一些东西)。但您可以尝试使用imageconvolution代替:

imageconvolution($imageResource, array(
    array( -1, -1, -1 ),
    array( -1, 16, -1 ),
    array( -1, -1, -1 ),
), 8, 0);

您可能需要查看PHP imageconvolution() leaves black dot in the upper left cornerimageconvolution似乎存在问题

另一种可能性是在应用文本之前调整图像大小,使其(例如)大200%。然后再使用200%更大的字体应用文本。然后对图像进行下采样。根据字体特征,这将减少模糊。使用2的整数幂(200%,400%,...)有助于减少伪影。

答案 2 :(得分:0)

你正在使用Roboto字体的两个极端。选择灯光或普通版本,它会变暗,而不会黑暗。

字体渲染器的抗锯齿功能无法使细线的厚度小于一个像素,因此会使它们变暗。