PHP GD, изменяющий размер прозрачного изображения, дающий черную рамку

Я пытаюсь уменьшить размер некоторых прозрачных изображений в PHP с помощью GD, и всякий раз, когда я это делаю, вокруг них добавляется странная черная рамка.

До before

После введите здесь описание изображения

Код

<?php
    $image = imagecreatefromstring(file_get_contents('logo.png'));
    $width = imagesx($image);
    $height = imagesy($image);

    $newWidth = $width - 1;
    $newHeight = $height - 1;
    $output = imagecreatetruecolor($newWidth, $newHeight);
    imagecolortransparent($output, imagecolorallocatealpha($output, 0, 0, 0, 127));
    imagealphablending($output, false);
    imagesavealpha($output, true);
    imagecopyresampled($output, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);

    header('Content-Type: image/png');
    imagepng($output);
?>

Кажется, что если я изменю код, чтобы новые размеры совпадали со старыми (удалив - 1), черные рамки не появятся. Таким образом, изменение размера вызывает проблему.

Кто-нибудь знает, что может быть не так?

Изменить: я только что понял, что это происходит только с imagecopyresampled. а не imagecopyresized. Однако imagecopyresampled дает гораздо лучший визуальный эффект, и я хотел бы заставить его работать, если это возможно.


person Alex Turpin    schedule 15.11.2011    source источник
comment
Похоже, что сглаживание использует черный цвет для матового цвета.   -  person Brad    schedule 15.11.2011
comment
@Брэд, действительно так. Однако на странице документации сказано, что сглаживание по умолчанию отключено и что оно поставляется только с комплектной версией GD, которую я не использую. Возможно, это вызвано какой-то другой функцией, но я не вижу никаких других параметров, насколько я могу судить...   -  person Alex Turpin    schedule 15.11.2011
comment
Я только что понял, что это происходит только с imagecopyresampled, а не imagecopyresized. Однако imagecopyresampled дает гораздо лучший визуальный эффект, и я бы хотел, чтобы он работал, если это возможно.   -  person Alex Turpin    schedule 15.11.2011
comment
@ Xeon06, если вы найдете решение, пожалуйста, сообщите мне.   -  person Ali Nouman    schedule 15.11.2011


Ответы (1)


Я думаю, что проблема здесь в вашем исходном изображении.

У вас есть не полноцветный PNG с альфа-каналом, а PNG с индексированным цветом и прозрачным цветом. Это видно, если открыть изображение в Photoshop:

Изображение в Photoshop

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

Я подозреваю, что если вы исправите изображение, сделав его полностью RGB с альфа-каналом, у вас не будет этой проблемы.

person Brad    schedule 15.11.2011
comment
Спасибо за ответ. Возможно, вы знаете какой-либо способ заставить его работать программно или это невыполнимо? - person Alex Turpin; 15.11.2011
comment
Лучше всего было бы получить хорошее исходное изображение. Это было легко исправить для вас в Photoshop. Напишите мне по адресу [email protected], и я вышлю вам обновленный файл. - person Brad; 16.11.2011
comment
Большое спасибо за вашу помощь. Проблема в том, что это делают наши клиенты через веб-интерфейс. Я полагаю, им придется обойтись. Спасибо еще раз. - person Alex Turpin; 16.11.2011
comment
@ Xeon06, возможно, вы можете принимать только изображения в реальном цвете? Или, может быть, есть способ преобразовать это изображение в полное неиндексированное изображение RGB перед изменением размера? - person Brad; 16.11.2011
comment
это то, о чем я задавался вопросом, был ли способ преобразовать его заранее. - person Alex Turpin; 16.11.2011
comment
@Xeon06, А что, если бы ты сделал imagecreatefrompng(), потом imagesavealpha(), а потом сразу imagepng(). Никакого изменения размера, просто открыть, установить альфа-сохранение, а затем вывести? Если вы возьмете этот вывод, а затем измените размер, вы получите ту же проблему? Что, если вы сначала попробуете imagesavealpha() на исходном изображении? - person Brad; 16.11.2011
comment
В обоих случаях я получаю те же проблемы. - person Alex Turpin; 16.11.2011
comment
@ Xeon06, в таком случае я подозреваю, что изображение должно быть заранее в нормальном формате. Возможно, вы сможете написать скрипт Gimp для этого, но я бы просто сначала проверил изображение в истинном цвете и просто не принял файл, который является странным, как этот. - person Brad; 16.11.2011