Я пытаюсь уменьшить некоторые прозрачные изображения на PHP с помощью GD, и всякий раз, когда я это делаю, вокруг него добавляется странная черная граница.
До
После
Код
<?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
дает гораздо лучший визуальный эффект, и я хотел бы заставить его работать, если это возможно.
Я думаю, проблема здесь в вашем исходном изображении.
То, что у вас есть, не является истинным цветом PNG с альфа-каналом, а PNG с индексированным цветом с прозрачным цветом. Это видно, если вы открываете изображение в Photoshop:
Это изображение было создано с помощью сглаживания уже (что дает желтый текст, который видится здесь на белом фоне), но при его изменении размера подспиксельные вычисления могут немного выходить за пределы их границ.
Я подозреваю, что если вы исправите изображение, сделав его полным RGB с альфа-каналом, у вас не будет этой проблемы.