Как получать глубину цвета в битах изображения?

В Пайтоне: как я могу знать глубину цвета в битах цифрового изображения, хранившегося в файле TIFF? Например: 8, 16, 32 бита, и т.д.

Обычный подход состоит в том, чтобы использовать библиотеку PIL, чтобы загружать данные об изображении; однако, создав объект изображения этой формы, методы, ассоциируемые с этим объектом будут зависеть от типа нагруженного изображения, из-за которого какие-то методы как bits или _getexif они не доступны для изображений TIFF. С этим подходом также имеется метод mode что бросает информацию, связанную с типом информации, хранившейся пикселем; он полезный, но обобщать извлечение глубины цвета в битах может быть потребовало функции менее простой, чем он верит, так как существуют много комбинаций для способов.

8
задан 13.07.2017, 19:03
3 ответа

Если ты только нуждаешься в том, чтобы узнать глубину в битах изображения, ты можешь читать и интерпретировать заголовок файла TIFF с Python сигара, чтобы мочь получать информацию. Ты нуждаешься в модуле struct (он находится в стандартном книжном магазине) как единственная зависимость.

Следующий код - пример, что я думаю, что оно функционирует, я это протестировал с четырьмя типами tiff отличные,

  1. одноцветный (1 бит / пиксель)
  2. взберись серых (normalmeente 4 или 8 бит / пикселей)
  3. палитра цветов (обычно 8 бит / пикселей)
  4. RGB (24 бита, 3 байт / пикселя)

.

import struct

def get_tiff_depth(filename):
    bits_per_sample=1
    samples_per_pixel=1
    photometric_interpretation = None
    with open(filename, 'rb') as f:
        byte_order = f.read(2)
        if byte_order == 'II':
            prefix = '<'
        elif byte_order == 'MM':
            prefix = '>'
        else:
            raise ValueError('El fichero no parece ser un TIFF')
        (magic_number, offset) = struct.unpack(prefix + 'hI', f.read(6))
        if magic_number != 42:
            raise ValueError('El fichero no parece ser un TIFF')
        f.seek(offset)
        num_entries, = struct.unpack(prefix+'h', f.read(2))
        for i in range(num_entries):
            tag = f.read(12)
            (id_tag, type_tag, num_values, value) = struct.unpack(prefix+'hhii', tag)
            if id_tag == 258:
                bits_per_sample = value
            if id_tag == 262:
                photometric_interpretation = value
            elif id_tag == 277:
                samples_per_pixel = value
    if photometric_interpretation == 2: # rgb:
        return 24
    else:
        return bits_per_sample * samples_per_pix

Заметь: Ты можешь получать больше информации о внутренней структуре файлов TIFF здесь, но ему надоели желаниями.

4
ответ дан 01.12.2019, 08:16
  • 1
    С этим funci и # 243; n evalu и # 233; изображение, которое нуждалось в том, чтобы использовать, и верно я возвратил и # 243; правильная информация; однако, intent и # 233; открывать другое изображение TIFF характера и # 237; sticas сходные и результата один n и # 250; морской окунь полностью err и # 243; neo. Я не присоединяю im и # 225; гены, потому что они взвешивают м и # 225; s 100 МБ. – OSjerick 02.02.2016, 21:50

Когда-нибудь я использовал ImageMagick для какой-то вещи и консультаций например identify -verbose name.png и хотя не много Пайтона я думаю, что PythonMagick связан с этой, так что я думаю, что Вы могли бы использовать это таким образом:

import PythonMagick
image = PythonMagick.Image("YouFileName")
print image.depth()
3
ответ дан 01.12.2019, 08:16

Используя книжный магазин изображений Пайтона, PIL есть так называемый метод bits что дает тебе эту информацию, хотя я никогда не использовал ее с изображениями TIFF.

import Image
imagen = Image.open("foto.jpg")
im.bits
1
ответ дан 01.12.2019, 08:16
  • 1
    я не смог находить в documentaci и # 243; n этот метод, но есть так называемый attributo mode , которые могут служить для того, чтобы определить глубину изображения. – rnrneverdies 06.12.2015, 09:10
  • 2
    возможно, что у кода есть ошибка в im.bits? привет – Angel Angel 06.12.2015, 13:06
  • 3
    Этот м и # 233; все не функционирует с im и # 225; гены TIFF. Конечно, и #191; cu и # 225; l - различие между импортированием таких Image как import Image и from PIL import Image? – OSjerick 06.12.2015, 15:51
  • 4
    Я рекомендую использовать Pillow вместо PIL. У PIL есть хорошая погода, не давая содержания ему, в то время как Pillow - дружеский fork PIL, с documentaci и # 243; n м и # 225; s яичный белок и с м и # 225; s опора для различных версий Пайтона. pillow.readthedocs.org/en – jeasoft 06.12.2015, 17:24
  • 5
    И я согласовываюсь с @Jeasoft, забудьте PIL навсегда и используйте Pillow, одинокий PIL функционирует в Пайтоне Легэки (Пайтон 2) – astrojuanlu 07.12.2015, 09:38