xwd 输出 - 未知标头

xwd 输出 - 未知标头

我从文件浏览器的捕获中获得的输出:

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 图像。

相关内容