image - 在 Julia 中解码 .xwd 图像
问题描述
我正在尝试为 .xwd 图像(X Window Dump)编写解码器,因为 ImageMagick 非常慢。我发现的唯一规格是:
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],
reinterpret(UInt16, reverse(data[offset+poff+6:offset+poff+7]))[1],
reinterpret(UInt16, reverse(data[offset+poff+8:offset+poff+9]))[1],
reinterpret(UInt8, data[offset+poff+10])[1],
reinterpret(UInt8, 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, data, header)
Pixel number 0
R 0
G 0
B 0
flags 7
padding 0
julia> read_colormap_entry(1, data, header)
Pixel number 1
R 1
G 1
B 1
flags 7
padding 0
julia> read_colormap_entry(2, data, header)
Pixel number 2
R 2
G 2
B 2
flags 7
padding 0
现在,我在“直接颜色”视觉类中将实际图像数据存储在每个像素 4 字节块中。有人知道如何从中提取 RGB 值吗?
编辑:通过处理数据,我发现了如何提取 R 和 G 值
function read_pixel(i, j, data, 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, data, xwd_header)
Px value 741685248
r 53
g 56
b 0
我基本上不知道我在用颜色蒙版和位移做什么。谁能解释一下?谢谢 !
解决方案
推荐阅读
- python - 显示一天中时间的颜色条
- python - 转换为字符串或写入文件时对整数值的更改
- if-statement - 我根本无法输出第二行(否则如果少于 60 行)
- javascript - Google Maps API / JavaScript:如何找出自定义标记的基点/最低点以设置为锚点
- python-3.x - 使用 py2app 编译时如何修复未加载的库:@rpath/libssl.1.1.dylib?
- c# - 如何让我的 google play 应用支持更多设备?
- php - 如何在 HTML 文件中运行的 PHP 代码中隐藏电子邮件帐户密码?
- python-3.x - 使用 lmfit 对两个自变量进行非线性最小二乘拟合
- javascript - Immutable.JS Seq / 惰性映射性能最佳实践?
- c# - 在 .net 核心中点击 URL“http://localhost:5000/signalr/hubs”时未下载 Javascript 代码