PHP imageconvolution()在左上角留下黑点

时间:2012-10-16 15:22:43

标签: php transparent image-resizing php-gd

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

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

当使用上面的代码锐化透明PNG图像时,左上角会出现黑点(我尝试过不同的卷积内核,但结果是一样的)。调整大小后,图像看起来没问题。

第一张图片是原始图片

第二张图片是锐化的图片

Original image Sharpen image

编辑:我出错了什么?我正在使用从像素中检索的颜色。

$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%透明。那些零可能会导致问题......

1 个答案:

答案 0 :(得分:3)

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

作为一种变通方法,您可以在卷积之前保存该角落中的像素值,然后使用imageSetPixel()将其恢复。

您需要保存的像素位于(0,0),可能还需要检查透明度(但我认为它应该仅适用于imageColorAtimageSetPixel)。< / 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');
?>