Как конвертировать 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 очень хорошо поддерживает альфа-прозрачность.