微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Julia中解码.xwd图像

如何解决在Julia中解码.xwd图像

由于ImageMagick非常慢,因此我正在尝试为.xwd图像(X窗口转储)编写解码器。 我发现的唯一规格是:

http://www.opensource.apple.com/source/X11/X11-0.40.80/xc/include/XWDFile.h?txt

https://formats.kaitai.io/xwd/index.html

我设法从中读取标题

xwd_data = read(`xwd -id $id`)

function get_header(data)
    args = [reinterpret(Int32,reverse(data[4*i-3:4*i]))[1] for i in 1:25]
    xwd = XwdHeader(args...)
    return xwd
end

struct XwdHeader
    header_size::Int32
    file_version::Int32
    pixmap_format::Int32
    pixmap_depth::Int32
    pixmap_width::Int32
    pixmap_height::Int32
    xoffset::Int32
    byte_order::Int32
    bitmap_unit::Int32
    bitmap_bit_order::Int32
    bitmap_pad::Int32
    bits_per_pixel::Int32
    bytes_per_line::Int32
    visual_class::Int32
    red_mask::Int32
    green_mask::Int32
    blue_mask::Int32
    bits_per_rgb::Int32
    colormap_entries::Int32
    ncolors::Int32
    window_width::Int32
    window_height::Int32
    window_x::Int32
    window_y::Int32
    window_bdrwidth::Int32
end

和颜色图,颜色图以12个字节的块和小尾数字节顺序存储:

function read_colormap_entry(n,data,header)
    offset = header.header_size + 1
    poff = 12*n
    px = Pixel(reinterpret(UInt32,reverse(data[offset+poff:offset+poff+3]))[1],reinterpret(UInt16,reverse(data[offset+poff+4:offset+poff+5]))[1],reverse(data[offset+poff+6:offset+poff+7]))[1],reverse(data[offset+poff+8:offset+poff+9]))[1],reinterpret(UInt8,data[offset+poff+10])[1],data[offset+poff+11])[1])
    println("Pixel number ",px.entry_number >> 16)
    println("R ",px.red >> 8)
    println("G ",px.green >> 8)
    println("B ",px.blue >> 8)
    println("flags ",px.flags)
    println("padding ",px.padding)
end


struct Pixel
    entry_number::UInt32
    red::UInt16
    green::UInt16
    blue::UInt16
    flags::UInt8
    padding::UInt8
end
julia> read_colormap_entry(0,header)
Pixel number 0
R 0
G 0
B 0
flags 7
padding 0

julia> read_colormap_entry(1,header)
Pixel number 1
R 1
G 1
B 1
flags 7
padding 0

julia> read_colormap_entry(2,header)
Pixel number 2
R 2
G 2
B 2
flags 7
padding 0

现在,我在“直接彩色”视觉类中将实际图像数据存储在每个像素4个字节的块中。有人知道如何从中提取RGB值吗?

编辑: 通过处理数据,我发现了如何提取R和G值

function read_pixel(i,j,header::XwdHeader)
    w = header.window_width
    h = header.window_height
    offset = header.header_size + header.colormap_entries * 12 + 1
    poff = 4*((i-1)*w + (j-1))
    px = reinterpret(UInt32,reverse(data[offset+poff:offset+poff+3]))[1]
    println("Px value ",px)
    r = (px & xwd.red_mask) >> 16
    g = (px & xwd.green_mask) >> 8
    b = (px & xwd.blue_mask)
    println("r ",r)
    println("g ",g)
    println("b ",b)
end

给出正确的R和G值,但B值应不为零。

julia> read_pixel(31,31,xwd_header)
Px value 741685248
r 53
g 56
b 0

我基本上不知道我在使用彩色掩膜和 位移。有人可以解释吗?谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。