Как проверить PNG для оттенка серого/альфа-цвета?

У PHP и GD, похоже, возникают проблемы с созданием изображений из PNG в оттенках серого с альфа-каналом при использовании imagecreatefrompng(). Результаты невероятно искажены.

Мне было интересно, знает ли кто-нибудь способ проверки цветового типа, чтобы уведомить пользователя о несовместимости?

Пример:

Исходное изображение: http://dl.dropbox.com/u/246391/Robin.png
Результирующее изображение: http://dl.dropbox.com/u/246391/Robin_result.png

Код:

<?php

$resource = imagecreatefrompng('./Robin.png');
header('Content-type: image/png');
imagepng($resource);
imagedestroy($resource);

Ваше здоровье,

Арон


person ac94    schedule 13.01.2010    source источник
comment
Что вы имеете в виду под искаженным? Есть определенные шаги, которые необходимо предпринять, чтобы сохранить альфа-прозрачность. Но проблемы с оттенками серого... для меня это ново   -  person Horia Dragomir    schedule 13.01.2010
comment
Я обновил свой пример, чтобы включить пример изображения. Сохранение альфа-прозрачности в порядке. Это особенно изображения в оттенках серого с прозрачностью, с которыми GD не может справиться, см. Ответ Хаима Евги ниже.   -  person ac94    schedule 13.01.2010


Ответы (3)


Цветовой тип изображения PNG хранится в файле со смещением 25 байт (начиная с 0). Итак, если вы можете получить фактические байты файла PNG, просто посмотрите на байт 25 (я не делаю PHP, поэтому я не знаю, как это сделать):

  • 0 - оттенки серого
  • 2 - RGB
  • 3 - RGB с палитрой
  • 4 - оттенки серого + альфа
  • 6 - RGB+альфа

Предыдущий байт (смещение 24) дает количество битов на канал. Дополнительные сведения см. в спецификации PNG.

В небольшом повороте файл PNG может иметь «1-битную альфу» (например, GIF) за счет наличия фрагмента tRNS (когда это тип цвета 0, 2 или 3).

person David Jones    schedule 22.01.2010

я приземлился здесь сегодня в поисках способа сказать (через php), является ли конкретное изображение .png альфа-png -
Ответ Дэвида Джонса указывает на правильное направление, очень легко реализовать в php:

file_get_contents, чтобы загрузить только эти 25 байт (вот оно, действительно!), и
ord(), чтобы получить его значение ASCII, чтобы проверить его (против ' 6' в моем случае)

if(ord(file_get_contents($alpha_png_candidate, NULL, NULL, 25, 1)) == 6) {
  is_alpha_png_so_do_something();
  }

на самом деле мне нужно было, чтобы для обеспечения обратной совместимости с ie6 на страницах, созданных пользователями cms, заменить все теги alpha-png ‹ img> на inline-block ‹ spans > - файл alpha-png затем будет использоваться в качестве переменной для собственного свойства ms css filter

.alpha_png_span{
  filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(
    src='$alpha_png_candidate', sizingMethod='crop')
  }

... и все работает, так что спасибо!

Паоло

person pikappa73    schedule 30.01.2010
comment
Вместо этого использование (bool) (ord(file_get_contents($alpha_png_candidate, NULL, NULL, 25, 1)) & 4) сообщит вам, есть ли альфа-канал, независимо от того, является ли изображение в оттенках серого или rgb. - person Walf; 21.03.2014

см. этот ответ:

Еще одно полезное замечание для тех, кто использует ImageCreateFromPng: PHP и GD не распознают изображения в градациях серого/альфа.

Поэтому, если вы используете изображения в градациях серого с прозрачностью от 0 % до 100 %, сохраните изображение как RGB.

По крайней мере, это верно для PHP версии 4.4.2-1 и 5.1.2-1 с изображениями, сделанными с помощью GIMP 2.2.8.

URL: http://php.net/manual/en/function.imagecreatefrompng.php< /а>

person Haim Evgi    schedule 13.01.2010
comment
Спасибо, однако я ищу способ определить, что изображение имеет оттенки серого с прозрачностью, прежде чем пытаться создать ресурс с помощью imagecreatefrompng(). Изображения отправляются на сайт, поэтому, к сожалению, у меня нет возможности повторно сохранить изображение как RBG (по крайней мере, я не знаю такого метода). - person ac94; 13.01.2010