xwd output - cabeçalho desconhecido

1

A saída que recebo de uma captura do navegador de arquivos:

xwd -name "CVandXdo - File Browser" -out capture.xwd

Não corresponde à especificação definida para arquivos xwd .

Eu planejo analisar a saída de um programa de reconhecimento de imagem. Mas não consigo localizar o cabeçalho xwd. Preciso saber onde os pixels começam e quantas linhas e colunas existem.

Aqui está o começo do arquivo xwd usando um editor hexadecimal. O comando xwd colocou outro cabeçalho antes de pensar, mas não consigo encontrar sua documentação. Eu suponho que há um cabeçalho de 0x00 para 0x7c, mas o cabeçalho real do formato xwd não parece começar depois dele.

00000000: 0000 007c 0000 0007 0000 0002 0000 0018  ...|............
00000010: 0000 01f1 0000 01b5 0000 0000 0000 0000  ................
00000020: 0000 0020 0000 0000 0000 0020 0000 0020  ... ....... ... 
00000030: 0000 07c4 0000 0004 00ff 0000 0000 ff00  ................
00000040: 0000 00ff 0000 0008 0000 0100 0000 0100  ................
00000050: 0000 01f1 0000 01b5 0000 055e 0000 007a  ...........^...z
00000060: 0000 0000 4356 616e 6458 646f 202d 2046  ....CVandXdo - F
00000070: 696c 6520 4272 6f77 7365 7200 0000 0000  ile Browser.....
00000080: 0000 0000 0000 0701 0001 0101 0101 0101  ................

Este é o mesmo arquivo, depois de abri-lo no GIMP e salvá-lo novamente.

00000000: 0000 0064 0000 0007 0000 0002 0000 0018  ...d............
00000010: 0000 01f1 0000 01b5 0000 0000 0000 0001  ................
00000020: 0000 0020 0000 0001 0000 0020 0000 0018  ... ....... ....
00000030: 0000 05d4 0000 0005 00ff 0000 0000 ff00  ................
00000040: 0000 00ff 0000 0008 0000 0000 0000 0000  ................
00000050: 0000 01f1 0000 01b5 0000 0040 0000 0040  ...........@...@
00000060: 0000 0000 edec ebed eceb edec ebed eceb  ................

Alguém pode me encontrar essa documentação arcana do xwd, ou talvez sua "implementação de saída", que explique seu comportamento? Todas as minhas pesquisas no Google resultaram em tutoriais sobre como tirar screenshots usando xwd.

    
por Federal_Reserve 20.11.2016 / 02:08

1 resposta

1

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.

    
por 20.11.2016 / 10:53