我正在尝试使用此代码锐化已调整大小的图像:
imageconvolution($imageResource, array(
array( -1, -1, -1 ),
array( -1, 16, -1 ),
array( -1, -1, -1 ),
), 8, 0);
当使用上面的代码锐化透明PNG图像时,左上角会出现黑点(我尝试过不同的卷积内核,但结果是一样的)。调整大小后,图像看起来没问题。
第一张图片是原始图片
第二张图片是锐化的图片
编辑:我出错了什么?我正在使用从像素中检索的颜色。
$color = imagecolorat($imageResource, 0, 0);
imageconvolution($imageResource, array(
array( -1, -1, -1 ),
array( -1, 16, -1 ),
array( -1, -1, -1 ),
), 8, 0);
imagesetpixel($imageResource, 0, 0, $color);
imagecolorat
是正确的功能吗?或者位置是否正确?
EDIT2 :我改变了坐标,但仍然没有运气。我检查了imagecolorat
给出的透明度(根据此post)。这是转储:
array(4) {
red => 0
green => 0
blue => 0
alpha => 127
}
Alpha 127 = 100%透明。那些零可能会导致问题......
答案 0 :(得分:3)
看起来像卷积码中的错误(角落在某些实现中是特殊情况)。
作为一种变通方法,您可以在卷积之前保存该角落中的像素值,然后使用imageSetPixel()
将其恢复。
您需要保存的像素位于(0,0),可能还需要检查透明度(但我认为它应该仅适用于imageColorAt
和imageSetPixel
)。< / p>
测试代码
文件'giants.png'我从上面发布的文件中找到了。如果我不使用imageSetPixel
,我会遇到相同的额外像素。使用imageSetPixel
,图像对我来说是正确的。
可能会在我运行ImageSaveAlpha
或设置alpha混合的序列中略有不同。
<?php
$giants = ImageCreateFromPNG('giants.png');
$imageResource = ImageCreateTrueColor(190, 190);
ImageColorTransparent($imageResource, ImageColorAllocateAlpha($imageResource, 0, 0, 0, 127));
ImageAlphaBlending($imageResource, False);
ImageSaveAlpha($imageResource, True);
ImageCopyResampled($imageResource, $giants, 0, 0, 0, 0, 190, 190, ImageSX($giants), ImageSY($giants));
$color = ImageColorAt($imageResource, 0, 0);
ImageConvolution($imageResource, array(
array( -1, -1, -1 ),
array( -1, 16, -1 ),
array( -1, -1, -1 ),
), 8, 0);
ImageSetPixel($imageResource, 0, 0, $color);
ImagePNG($imageResource, 'dwarves.png');
?>