Как PHP получить битовую глубину данного файла изображения PNG?

В PHP-коде, учитывая путь к изображению .png, мне нужно определить битовую глубину этого изображения. Как я могу это сделать?

Я попытался использовать getImageSize() и прочитать пример кода bits, как показано ниже, но он всегда возвращает «8» для 24-битного/32-битного изображения.

Пожалуйста помоги.

class Utils {
    //Ham de lay bits cua image
    public static function getBits($image) {
        $info = getImageSize($image);
        return $info['bits'];
    }
}

person Nam G VU    schedule 15.06.2011    source источник
comment
я думаю, это означает 8 бит на канал.   -  person Rufinus    schedule 15.06.2011
comment
@cweiske Прошу прощения за мой показатель 68% - у меня осталось много вопросов без ответа. Вы можете помочь?   -  person Nam G VU    schedule 15.06.2011
comment
@hakre Я всегда выбираю самый правильный ответ, чтобы он был принятым. Мне просто нужно, чтобы вы поняли, что 32% моих вопросов остаются неверными ответами, и я оставляю их непринятыми - НЕ потому, что я небрежный человек :). Спасибо за напоминание об этом в любом случае.   -  person Nam G VU    schedule 26.06.2011


Ответы (2)


Изображения PNG не поддерживаются для каналов и битов от getimagesize(). Однако вы можете использовать небольшую функцию для получения этих значений: get_png_imageinfo():

$file = 'Klee_-_Angelus_Novus.png';
$info = get_png_imageinfo($file);
print_r($info);

Дает вам для примера картинку:

Array
(
    [bit-depth] => 4
    [bits] => 4
    [channels] => 1
    [color] => 3
    [color-type] => Indexed-colour
    [compression] => 0
    [filter] => 0
    [height] => 185
    [interface] => 0
    [width] => 291
)

Он возвращает каналы и биты так, как некоторые ожидают их от getimagesize() рядом с дополнительная информация, относящаяся к формату PNG. Значение значений рядом с битами и каналами задокументировано в спецификация PNG.

person hakre    schedule 21.06.2011
comment
get_png_imageinfo кажется неработающим с PHP 5.5 (идеально работает с 5.4). Это не удается при сравнении array_shift. Возможно что-то новое в unpack(). - person Jeff; 07.07.2014
comment
В php 5.5+ замена A8sig на a8sig (или, что то же самое, Z8sig) в строке 22 делает это. Согласно php.net/manual/en/function.pack.php, a и Z относятся к строке, дополненной NUL, а A относится к строке, дополненной ПРОБЕЛОМ. - person danmichaelo; 11.05.2018

Из документации getImageSize:

биты - количество битов для каждого цвета.

Итак, 8 бит — это правильно, потому что если есть три канала (RGB) по восемь бит в каждом, в итоге вы получите 24 бита. Дополнительный альфа-канал дает вам еще восемь бит, всего 32 бита.

Попробуйте вернуть это:

return $info['channels'] * $info['bits'];

Однако это работает не для всех типов изображений. Прочтите документацию о том, как работают GIF и JPEG.

person HertzaHaeon    schedule 15.06.2011
comment
Ага. Это не работает для изображения PNG. Итак, PHP не может справиться с проблемами битовой глубины PNG, не так ли? Я действительно чувствую себя странно, так как PHP быстро растет - person Nam G VU; 15.06.2011