PHP imageconvolution() оставляет черную точку в верхнем левом углу

Я пытаюсь повысить резкость изображений с измененным размером, используя этот код:

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

Когда прозрачное PNG-изображение усиливается с помощью приведенного выше кода, оно появляется с черной точкой в ​​верхнем левом углу (я пробовал разные ядра свертки, но результат тот же). После изменения размера изображение выглядело нормально.

1-е изображение является исходным

2-е фото с резкостью

Исходное изображениеУвеличить резкость изображения

EDIT: что я делаю не так? Я использую цвет, полученный из пикселя.

$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
}

Альфа 127 = 100% прозрачность. Эти нули могут вызвать проблему...


person peter.o    schedule 16.10.2012    source источник


Ответы (1)


Похоже на ошибку в коде свертки (в некоторых реализациях углы — это особый случай).

В качестве обходного пути вы можете сохранить значение пикселя в этом углу непосредственно перед сверткой и восстановить его позже с помощью imageSetPixel().

Пиксель, который вам нужно сохранить, находится в (0,0), и, возможно, вам также нужно будет проверить прозрачность (но я думаю, что это должно работать только с imageColorAt и imageSetPixel).

ПРОВЕРОЧНЫЙ КОД

Файл 'giants.png' я получил из того, что вы разместили выше. Если я не использую imageSetPixel, я получаю те же дополнительные пиксели, что и вы. С imageSetPixel изображение выглядит правильно для меня.

Возможно, есть небольшая разница в последовательности, в которой я запускаю ImageSaveAlpha или устанавливаю альфа-смешивание.

<?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');
?>
person LSerni    schedule 16.10.2012
comment
Я пробовал, но безуспешно... не могли бы вы проверить мое редактирование? - person peter.o; 16.10.2012
comment
Я внес изменения, но безуспешно - person peter.o; 18.10.2012