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

PHP и GD, похоже, испытывают проблемы при создании изображений из PNG типа greyscale с альфа-каналом при использовании 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);

Приветствия

Aron

Ответы [ 3 ]

9 голосов
/ 22 января 2010

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

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

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

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

5 голосов
/ 30 января 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-user-Generated-Pages, чтобы заменить все alpha-png imageтеги на inline-block - файл alpha-png будет затем служить переменной для проприетарного свойства css filter

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

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

1025 * паоло *

0 голосов
/ 13 января 2010

смотри этот ответ :

Еще одно полезное замечание для тех, кто использует 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

...