我正在尝试使用以下代码锐化调整大小的图像:
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
是正确的功能吗?还是位置正确?伊迪丝2:我换了坐标,但还是没有运气。我已经检查了
imagecolorat
给出的透明度(根据这个post)。这是垃圾场:array(4) {
red => 0
green => 0
blue => 0
alpha => 127
}
阿尔法127=100%透明。这些零可能会导致问题…
最佳答案
在卷积代码中看起来像一个bug(在某些实现中,角点是特殊情况)。
作为解决方法,您可以在卷积之前将像素值保存在该角点,然后使用imageSetPixel()
还原它。
您需要保存的像素为(0,0),可能还需要检查透明度(但我认为它应该只适用于imageColorAt
和imageSetPixel
)。
测试代码
“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');
?>