Используя PHP получить тип PNG

В консоли Linux, если вы используете identify -verbose file.png это дает вам полную распечатку из файла. Есть ли способ получить ту же информацию в php?

В частности, мне нужна строка «Type», которая указывает тип png. TrueColorAlpha, PaletteAlpha, т. Д ..

Зачем?
Операционная система повреждена, и при попытке восстановить структуру из более чем 5 миллионов изображений 2 миллиона из них были сброшены в поиске. Некоторые из них созданы системой, а некоторые загружены. Если я смогу найти разницу между ними, это сэкономит огромное количество времени.

0

Решение

Из этих статей я написал простую функцию, которая может дать вам тип цвета файла PNG:

https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header

http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html

Вкратце: файл PNG состоит из заголовка и фрагментов. В заголовке со второго по четвертый байт должна быть строка ASCII, равная «PNG», после чего следуют чанки, имена которых составляют 4 байта. Блок IHDR дает вам некоторые данные об изображении, например, с, высоту и необходимый тип цвета. Позиция этого чанка всегда фиксирована, так как это всегда первый чанк. И это содержание описано во второй ссылке, которую я дал вам:

Блок IHDR должен появиться ПЕРВЫМ. Это содержит:

   Width:              4 bytes
Height:             4 bytes
Bit depth:          1 byte
Color type:         1 byte
Compression method: 1 byte
Filter method:      1 byte
Interlace method:   1 byte

Таким образом, зная длину заголовка, длину имени чанка и его структуру, мы можем вычислить положение данных типа цвета и его 26 байтов. Теперь мы можем написать простую функцию, которая читает цветовой тип файла PNG.

function getPNGColorType($filename)
{
$handle = fopen($filename, "r");

if (false === $handle) {
echo "Can't open file $filename for reading";
exit(1);
}

//set poitner to where the PNG chunk shuold be
fseek($handle, 1);
$mime = fread($handle, 3);
if ("PNG" !== $mime) {
echo "$filename is not a PNG file.";
exit(1);
}

//set poitner to the color type byte and read it
fseek($handle, 25);
$content = fread($handle, 1);
fclose($handle);

//get integer value
$unpack = unpack("c", $content);

return $unpack[1];
}

$filename = "tmp/png.png";
getPNGColorType($filename);

Вот номенклатура типа цвета (из второй ссылки):

   Color   Allowed     Interpretation
Type    Bit Depths

0       1,2,4,8,16  Each pixel is a grayscale sample.

2       8,16        Each pixel is an R,G,B triple.

3       1,2,4,8     Each pixel is a palette index;
a PLTE chunk must appear.

4       8,16        Each pixel is a grayscale sample,
followed by an alpha sample.

6       8,16        Each pixel is an R,G,B triple,

Надеюсь, это поможет.

1

Другие решения

Сделайте это с помощью кода Bash в вашем PHP Выполнение Bash-скрипта из PHP-скрипта

<?php
$type=shell_exec("identify -verbose $filename");
print_r($type);
?>
-1

По вопросам рекламы [email protected]