Скопируйте прозрачный PNG с помощью gdlib


В настоящее время у меня проблема с архивным плагином TinyMCE. При загрузке изображений он создает для них миниатюры. Но для прозрачного PNG фон был черным. Я подумал, ну, добавлю функции, чтобы сохранить прозрачность, но в конце концов это не работает. Я дополнительно прочитал всю документацию по PHP и вопросы/ответы по stackoverflow, но они мне не помогли.

Я свел проблему к нескольким строкам кода. На самом деле это не создает миниатюру, но имеет ту же проблему: все PNG с прозрачным фоном впоследствии имеют черный фон:

$thumb = imagecreatefrompng($originalPath);     
imagesavealpha($thumb, true);
imagealphablending($thumb, false);
imagepng($thumb, $thumbPath, 0);

Это работает, когда я создаю новое пустое изображение и заполняю его прозрачностью. но при создании его из любого существующего прозрачного PNG он терпит неудачу. я что-то пропустил?

Если это не может быть решено быстро, я собираюсь расширить плагин Archiv, чтобы опционально использовать ImageMagick...

Author: Andreas Linden, 2012-09-24

2 answers

Я также столкнулся с этой проблемой на прошлой неделе. После нескольких часов поиска и изучения, я думаю, что здесь есть что-то, что может объяснить проблему.

Прежде всего, PNG имеет несколько типов форматов: png на основе палитры и png истинного цвета. Кроме того, существует 3 способа реализации PNG с прозрачностью.

  1. PNG на основе палитры с флагом прозрачности
  2. Полноцветный (RGB) PNG с флагом прозрачности
  3. Полноцветный PNG с альфа-каналом (формат RGBA)

Это и есть причина, по которой иногда ваш код работает правильно, а иногда ваш код работает плохо. В статье Концепция прозрачности в PNG подробно объясняется различие этих 3 типов.

Я попробовал ваш код. Он будет отлично работать, если ваше исходное изображение в формате png имеет формат truecolor PNG с альфа-каналом. В противном случае часть прозрачности вашего выходного изображения будет черного цвета.

Вот два изображения в формате png. Тот, у которого внизу черная область, относится к формату типа 2. Другой - это Формат RGBA.

enter image description hereenter image description here

 1
Author: James, 2015-01-18 06:23:00

Не волнуйся, Андреас, твой скрипт работает хорошо, я только что его протестировал.

Я думаю, вы можете проверить версию GD PHP, над которой вы работаете. У меня есть GD версии 2.

 0
Author: boulet101010, 2012-09-25 12:40:27