3

我正在尝试使用以下代码锐化调整大小的图像:

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(根据这篇文章)给出的透明度。这是转储:

array(4) {
   red => 0
   green => 0
   blue => 0
   alpha => 127
}

Alpha 127 = 100% 透明。那些零可能会导致问题...

4

1 回答 1

3

看起来像卷积代码中的错误(角落是某些实现中的特殊情况)。

作为一种解决方法,您可以在卷积之前将像素值保存在该角落中,然后使用imageSetPixel().

您需要保存的像素位于 (0,0),并且可能您还需要检查透明度(但我认为它应该只imageColorAt与 and一起使用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');
?>
于 2012-10-16T15:28:20.787 回答