Как конвертировать PNG в 8-битный PNG с использованием библиотеки PHP GD - PullRequest
6 голосов
/ 22 апреля 2011

Я хочу написать процедуру, которая принимает путь к изображению PNG в качестве параметра и преобразует это изображение в 8-битное изображение PNG.Мне нужно использовать библиотеку PHP GD для этого.

Ответы [ 2 ]

12 голосов
/ 22 апреля 2011

Для преобразования любого 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-ИЗОБРАЖЕНИЕ

enter image description here

(назначение: pfc8bit.png) ПРЕОБРАЗОВАННОЕ PNG-ИЗОБРАЖЕНИЕ (8 бит)

enter image description here

Надеюсь, кто-то найдет это полезным.

8 голосов
/ 17 декабря 2011

Вместо библиотеки GD я настоятельно рекомендую использовать pngquant 1.5 + из командной строки с использованием функций exec() или popen().

Библиотека GD содержит код генерации палитры очень низкого качества.

То же изображение, что и в другом ответе, тот же размер файла, что и в библиотеке GD, но преобразовано с использованием pngquant в просто 100 цветов (даже не 256):

enter image description here

pngquant очень хорошо поддерживает альфа-прозрачность.

...