파일 브라우저 캡처에서 얻은 출력은 다음과 같습니다.
xwd -name "CVandXdo - File Browser" -out capture.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.h
X11의 일부인 포함 파일에는 더 많은 정보가 포함되어 있습니다. 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 이미지를 조사하기 위한 포드입니다.