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

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