2016-11-04 3 views
0

У меня есть набор 16-битных png-файлов, записанных с помощью LabVIEW. По какой-то причине мне нужно их перетащить, чтобы использовать их. И для этого мне нужно количество значимых бит. Как я могу читать те, которые используют Python? В Matlab существует метод, называемый imfinfo, который возвращает значимые биты.Прочитать количество значимых бит .png?

+0

Вы можете получить число значащих бит 'int' в Python3 с' .bit_length' метода. –

+1

Предполагается, что 16-разрядный PNG имеет 16 значащих бит на компонент цвета, но PNG также имеет необязательный блок «sBIT», который, если присутствует, передает количество значимых бит каждого компонента. Объедините эту информацию со значением из метода .bit_length, предложенным @ PM2Ring, чтобы узнать, сколько вам нужно выполнить сбой. –

ответ

0

Как было предложено @Glen Рандерс-Pehrson, я только что прочитал SBIT куска:

import struct 
import binascii 

def __header(bytes): 
    return struct.unpack('>NNccccc', bytes) 

def __getSBit(bytes): 
    bytes = bytes[8:] 

    sBit = 0 

    while bytes: 
     length = struct.unpack('>I', bytes[:4])[0] 
     bytes = bytes[4:] 

     chunk_type = bytes[:4] 

     bytes = bytes[4:] 

     chunk_data = bytes[:length] 
     bytes = bytes[length:] 

     if chunk_type == "sBIT": 
      sBit = int(chunk_data.encode("hex"), 16) 
      break 

     bytes = bytes[4:] 

    return sBit 

def getSigniticantBits(filename): 
    with open(filename, 'rb') as f: 
     bytes = f.read() 

    return __getSBit(bytes)