В консоли Linux, если вы используете identify -verbose file.png
это дает вам полную распечатку из файла. Есть ли способ получить ту же информацию в php?
В частности, мне нужна строка «Type», которая указывает тип png. TrueColorAlpha, PaletteAlpha, т. Д ..
Зачем?
Операционная система повреждена, и при попытке восстановить структуру из более чем 5 миллионов изображений 2 миллиона из них были сброшены в поиске. Некоторые из них созданы системой, а некоторые загружены. Если я смогу найти разницу между ними, это сэкономит огромное количество времени.
Из этих статей я написал простую функцию, которая может дать вам тип цвета файла 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,
Надеюсь, это поможет.
Сделайте это с помощью кода Bash в вашем PHP Выполнение Bash-скрипта из PHP-скрипта
<?php
$type=shell_exec("identify -verbose $filename");
print_r($type);
?>