xwd 출력 - 알 수 없는 헤더

xwd 출력 - 알 수 없는 헤더

파일 브라우저 캡처에서 얻은 출력은 다음과 같습니다.

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

불일치xwd 파일에 대해 정의된 사양.

이미지 인식 프로그램의 출력을 구문 분석할 계획입니다. 하지만 xwd 헤더를 현지화할 수 없습니다. 픽셀이 시작되는 위치와 행과 열의 개수를 알아야 합니다.

16진수 편집기를 사용하여 xwd 파일의 시작 부분입니다. xwd 명령은 내가 생각하기 전에 다른 헤더를 추가했지만 이에 대한 문서를 찾을 수 없습니다. 0x00부터 0x7c까지 헤더가 있다고 가정했는데 실제 xwd 형식 헤더는 그 이후부터 시작되지 않는 것 같습니다.

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  ................

김프에서 열어서 다시 저장해도 똑같은 파일입니다.

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  ................

누군가 나에게 이 신비한 xwd 문서나 그 동작을 설명할 수 있는 "출력 구현"을 찾을 수 있습니까? 내가 검색한 모든 내용은 xwd를 사용하여 스크린샷을 찍는 방법에 대한 튜토리얼을 찾았습니다.

답변1

/usr/include/X11/XWDFile.hX11의 일부인 포함 파일에는 더 많은 정보가 포함되어 있습니다. xorg-x11-proto-devel내 시스템의 rpm에서 이 파일을 찾았습니다 . 특히, HeaderSize귀하의 링크가 항상 40이라고 말하는 것은 올바르지 않습니다. 헤더 파일은 다음과 같이 말합니다.header_size = SIZEOF(XWDheader) + null로 끝나는 창 이름의 길이. 파일의 또 다른 유용한 설명은 다음과 같습니다.

Null로 끝나는 창 이름은 위의 구조를 따릅니다. 다음은 파일의 오프셋 XWDFileHeader.header_size에 있는 XWDColor 구조입니다. XWDFileHeader.ncolors는 XWDColor 구조가 몇 개 있는지 알려줍니다.

다음은 xwd 파일의 시작 부분을 읽고 일부 정보를 인쇄하는 Python 코드입니다. 첫 번째 이미지 픽셀의 오프셋을 계산합니다.

#!/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

제공하신 데이터 예제에 적용하면 다음과 같습니다.

header_size 124  ncolors 256
offset 6780 0x1a7c
bits_per_pixel 32

또 하나 봤어진주xwd 이미지를 조사하기 위한 포드입니다.

관련 정보