Pregunta

Necesito leer TGA con Pyqt y hasta ahora esto parece estar funcionando bien, excepto donde un TGA tiene 2 bytes por píxel en lugar de 3 o 4. Mi código se toma desde aquí http://pastebin.com/b5vz61dz.

Específicamente esta sección:

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

y esta parte:

elif bytesPerPixel == 2:
    # if greyscale
    color = QColor.fromHsv( 0, pixel[0] , pixel[1])
    color = color.value()

¿Cómo ingresaría los valores Pixel [0] y Pixel [1] para crear los valores en el formato y el espacio de colores correctos?

¡Cualquier pensamiento, idea o ayuda, por favor!

¿Fue útil?

Solución

pixel = [ pixel[1]*2 , pixel[1]*2 , pixel[1]*2 ]
color = qRgb(*pixel)

funciona para mi. Luminancia correcta y todo. Aunque no estoy seguro de duplicar el valor de Pixel [1] funcionaría para todas las instancias.

Gracias por toda la ayuda Istepura :)

Otros consejos

http://lists.xcf.berkeley.edu/lists/gimp-developer/2000-august/013021.html

"Los píxeles se almacenan en orden pequeño, en formato BGR555".

Por lo tanto, debe tomar 5 bits de píxeles "a la izquierda" de píxeles [1] como azul, descansar 3 bits + 2 bits de píxel "más izquierdo" [0] serían verdes, y los próximos 5 bits de píxel [0] serían rojos.

En su caso, supongo, el código debería ser algo así como:

pixel = [(pixel[1]&0xF8)>>3, ((pixel[1]&0x7)<<2)|((pixel[0]&0xC0)>>6), (pixel[0]&0x3E)>>1)
color = qRgb(*pixel)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top