Как конвертировать PNG в 8-битный PNG с использованием библиотеки PHP GD

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

2 ответа

Решение

Для преобразования любого 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-разрядное)

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

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

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

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

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

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

Другие вопросы по тегам