我从文件浏览器的捕获中获得的输出:
xwd -name "CVandXdo - File Browser" -out capture.xwd
不匹配为 xwd 文件定义的规范。
我计划解析图像识别程序的输出。但我无法本地化 xwd 标头。我需要知道像素从哪里开始以及有多少行和列。
这是使用十六进制编辑器的 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 ................
这是我在 GIMP 中打开并再次保存后的同一个文件。
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 结尾的窗口名称的长度。文件中进一步有用的注释是
以空结尾的窗口名称遵循上述结构。接下来是 XWDColor 结构,位于文件中的偏移量 XWDFileHeader.header_size 处。 XWDFileHeader.ncolors 告诉有多少个 XWDColor 结构。
下面是一些 Python 代码,用于读取 xwd 文件的开头并打印其中一些信息。它计算第一个图像像素的偏移:
#!/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
我看到还有一个珀尔pod 来调查 xwd 图像。