O arquivo de inclusão /usr/include/X11/XWDFile.h
, que faz parte do X11, contém mais informações. Eu encontrei este arquivo em rpm xorg-x11-proto-devel
no meu sistema. Em particular, o HeaderSize
que seu link diz ser sempre 40 está incorreto. O arquivo de cabeçalho diz header_size = SIZEOF (XWDheader) + comprimento do nome da janela terminada com nulo . Outros comentários úteis no arquivo são
Null-terminated window name follows the above structure. Next comes XWDColor structures, at offset XWDFileHeader.header_size in the file. XWDFileHeader.ncolors tells how many XWDColor structures there are.
Aqui está um pouco de python para ler o início de um arquivo xwd e imprimir algumas dessas informações. Calcula o deslocamento para os primeiros pixels da imagem:
#!/usr/bin/python
import sys, struct
XWDColorlen = 4*3*2+2*1
MSBFirst = 1
class Xwd:
def __init__(self,data):
(self.header_size,
self.file_version,
self.pixmap_format,
self.pixmap_depth,
self.pixmap_width,
self.pixmap_height,
self.xoffset,
self.byte_order,
self.bitmap_unit,
self.bitmap_bit_order,
self.bitmap_pad,
self.bits_per_pixel,
self.bytes_per_line,
self.visual_class,
self.red_mask,
self.green_mask,
self.blue_mask,
self.bits_per_rgb,
self.colormap_entries,
self.ncolors,
self.window_width,
self.window_height,
self.window_x,
self.window_y,
self.window_bdrwidth) = struct.unpack(">25I",data[:100])
f = file(sys.argv[1])
data = f.read()
xwd = Xwd(data)
print("header_size %d ncolors %d" % (xwd.header_size, xwd.ncolors))
offset = xwd.header_size+xwd.ncolors*XWDColorlen
print("offset %d 0x%x" % (offset,offset))
print("bits_per_pixel %d" % xwd.bits_per_pixel)
if xwd.bits_per_pixel==32:
if xwd.byte_order==MSBFirst:
fmt = ">I"
else:
fmt = "<I"
for i in range(20):
print("%08x" % struct.unpack(fmt,data[offset:offset+4]))
offset += 4
Aplicado ao exemplo de dados que você forneceu, diz
header_size 124 ncolors 256
offset 6780 0x1a7c
bits_per_pixel 32
Eu vejo que há também um pod perl para investigar imagens xwd.