2 бит на пиксельный цвет TGA в QRGB
Вопрос
Мне нужно читать TGA с PYQT, и пока это, кажется, работает нормально, за исключением случаев, когда TGA имеет 2 байта на пиксель, в отличие от 3 или 4. Мой код взят отсюда http://pastebin.com/b5vz61dz.
В частности, этот раздел:
def getPixel( file, bytesPerPixel):
'Given the file object f, and number of bytes per pixel, read in the next pixel and return a qRgba uint'
pixel = []
for i in range(bytesPerPixel):
pixel.append(ord(file.read(1)))
if bytesPerPixel==4:
pixel = [pixel[2], pixel[1], pixel[0], pixel[3]]
color = qRgba(*pixel)
elif bytesPerPixel == 3:
pixel = [pixel[2], pixel[1], pixel[0]]
color = qRgb(*pixel)
elif bytesPerPixel == 2:
# if greyscale
color = QColor.fromHsv( 0, pixel[0] , pixel[1])
color = color.value()
return color
И эта часть:
elif bytesPerPixel == 2:
# if greyscale
color = QColor.fromHsv( 0, pixel[0] , pixel[1])
color = color.value()
Как бы я ввел значения Pixel [0] и Pixel [1], чтобы создать значения в правильном формате и цветном пространстве?
Любые мысли, идеи или помощь, пожалуйста !!!
Решение
pixel = [ pixel[1]*2 , pixel[1]*2 , pixel[1]*2 ]
color = qRgb(*pixel)
работает на меня. Правильная яркости и все. Хотя я не уверен, что значение Pixel [1] будет работать для всех экземпляров.
Спасибо за всю помощь iStepura :)
Другие советы
http://lists.xcf.berkeley.edu/lists/gimp-developer/2000-august/013021.html
«Пиксели хранятся в матч-эндэндинском порядке, в формате BGR555».
Таким образом, вы должны взять «крайний левый» 5 битов пикселя [1] как синий, отдых 3 бита + 2 «самые левые» биты пикселя [0] были бы зелеными, а следующие 5 бит пикселя [0] будут красными.
В вашем случае, я полагаю, код должен быть чем -то вроде:
pixel = [(pixel[1]&0xF8)>>3, ((pixel[1]&0x7)<<2)|((pixel[0]&0xC0)>>6), (pixel[0]&0x3E)>>1)
color = qRgb(*pixel)