我正在使用PHP的ImageMagick将图像的白色背景变成透明的。 我将图片URL传递给这个PHP脚本,并返回图像。
这些转换效果相当不错。但是,如果我的图片中有一个白色物体,通过将模糊值传递给paintTransparentImage()来清除锯齿边缘的结果就不是很好了。
下面是结果示例,请注意白色沙发: 如果我不传递模糊值,那么我会得到一个适当的裁剪,但是边缘会很凌乱。 我尝试使用 resizeImage() 来实现所谓的“空间抗锯齿”(将图像放大 -> 使用 paintTransparentImage() -> 缩小图像),但我没有注意到任何显着的变化。
<?php
# grab the remote image url
$imgUrl = $_GET['img'];
# create new ImageMagick object
$im = new Imagick($imgUrl);
# remove extra white space
$im->clipImage(0);
# convert white background to transparent
$im->paintTransparentImage($im->getImageBackgroundColor(), 0, 3000);
# resize image --- passing 0 as width invokes proportional scaling
$im->resizeImage(0, 200, Imagick::FILTER_LANCZOS, 1);
# set resulting image format as png
$im->setImageFormat('png');
# set header type as PNG image
header('Content-Type: image/png');
# output the new image
echo $im->getImageBlob();
这些转换效果相当不错。但是,如果我的图片中有一个白色物体,通过将模糊值传递给paintTransparentImage()来清除锯齿边缘的结果就不是很好了。
下面是结果示例,请注意白色沙发: 如果我不传递模糊值,那么我会得到一个适当的裁剪,但是边缘会很凌乱。 我尝试使用 resizeImage() 来实现所谓的“空间抗锯齿”(将图像放大 -> 使用 paintTransparentImage() -> 缩小图像),但我没有注意到任何显着的变化。
有什么办法可以更好地处理这些非常白的图像吗?我已经尝试了 trimImage() 和 edgeImage(),但我无法获得我想要的结果。
最坏的情况是,(虽然不理想),是否有一种方法可以识别图像是否包含特定颜色的某个百分比?例如,如果图像包含 >90% 的白色像素,则我可以以模糊值为0而不是3000运行 paintTransparentImage(),这至少会给我一个正确的切割。
谢谢。