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

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.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 画像を調べるためのポッドです。

おすすめ記事