PHP GD изменяет размер прозрачного изображения, давая черную рамку - PullRequest
10 голосов
/ 15 ноября 2011

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

До before

После enter image description here

Код

<?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), черные границы не появятся.Таким образом, изменение размера вызывает проблему.

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

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

1 Ответ

3 голосов
/ 15 ноября 2011

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

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

Image as seen in Photoshop

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

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

...