#php #png #gdlib #png-8
#php #png #gdlib #png-8
Вопрос:
Я хочу написать процедуру, которая принимает путь к изображению PNG в качестве параметра и преобразует это изображение в 8-битное PNG-изображение. Для этого мне нужно использовать библиотеку PHP GD.
Комментарии:
1. В чем ваш вопрос? Приятно, что вы рассказываете нам о своем списке дел на день, но это не значит, что это вопрос.
2. ImageMagick был бы лучшим вариантом.
3. @Znarkus Я не был уверен, возможно ли это вообще в GD, но @Wh1T3h4Ck5 доказал, что я ошибался.
Ответ №1:
Чтобы преобразовать любое изображение PNG в 8-разрядный PNG, используйте эту функцию, я только что создал
функция convertPNGto8bitPNG ()
function convertPNGto8bitPNG ($sourcePath, $destPath) {
$srcimage = imagecreatefrompng($sourcePath);
list($width, $height) = getimagesize($sourcePath);
$img = imagecreatetruecolor($width, $height);
$bga = imagecolorallocatealpha($img, 0, 0, 0, 127);
imagecolortransparent($img, $bga);
imagefill($img, 0, 0, $bga);
imagecopy($img, $srcimage, 0, 0, 0, 0, $width, $height);
imagetruecolortopalette($img, false, 255);
imagesavealpha($img, true);
imagepng($img, $destPath);
imagedestroy($img);
}
Параметры
- $sourcePath — Путь к исходному файлу PNG
- $destPath — Путь к целевому файлу PNG
Примечание
Я рекомендую убедиться, что она $sourcePath
существует и $destPath
доступна для записи, прежде чем запускать этот код. Возможно, эта функция не будет работать с некоторыми прозрачными изображениями.
Использование
convertPNGto8bitPNG ('pfc.png', 'pfc8bit.png');
Пример (оригинал -> 8-разрядный)
(Источник: pfc.png) ИСХОДНОЕ ИЗОБРАЖЕНИЕ в ФОРМАТЕ PNG
(Назначение: pfc8bit.png) ПРЕОБРАЗОВАННОЕ ИЗОБРАЖЕНИЕ PNG (8-разрядное)
Надеюсь, кто-нибудь найдет это полезным.
Комментарии:
1. @Nilesh, я только что попробовал с несколькими прозрачными PNG, и это работает? Пришлите мне ссылку на прозрачный PNG, который вы используете.
2. Изображение, которое я использовал, это: google.co.in/imgres?imgurl=http://www.axdn.com/redist /…
3. @Nilesh, ДА, ты был прав… Я забыл установить прозрачный цвет. Функция выше теперь имеет новое тело … Попробуйте еще раз.
4. @Wh1T3h4Ck5, Да, сейчас это работает. Но изображение пока не ясно. Я пробовал и с некоторыми другими изображениями
5. @Nilesh, я проводил исследование по этому поводу и обнаружил, что 8-разрядный PNG такой же, как GIF, потому что оба они используют прозрачность в битах (не имеют альфа-канала). На самом деле, я нашел решение для преобразования любого PNG в GIF (прозрачность, 256 цветов), но когда я пытаюсь преобразовать его в прозрачный PNG, он становится 32-разрядным (я думаю, потому что большинство функций GD возвращают 32-разрядные результаты). Но позже я обнаружил, что даже в окне «свойства» указано, что изображение, которое я создал таким образом, является 32-разрядным PNG, Photoshop распознает их как PNG-8, и эти изображения имеют фактический размер 8-разрядных PNG !? Странное поведение…
Ответ №2:
Вместо библиотеки GD я настоятельно рекомендую использовать pngquant 1.5 командную строку с использованием функций exec()
или popen()
.
Библиотека GD имеет очень некачественный код генерации палитры.
То же изображение, что и в другом ответе, тот же размер файла, что и в библиотеке GD, но преобразовано с использованием pngquant
всего 100 цветов (даже не 256):
pngquant очень хорошо поддерживает альфа-прозрачность.