每个代表一个频道,我想将它们合并为一个频道,如RGB图像。图像是RAW,因此没有文件头。我已设法将它们与
混合cat imgPl0.raw imgPl1.raw imgPl2.raw >> img.rgb
但这是一个接一个地混合飞机,但有没有办法进行隔行扫描混音?
也许使用imagemagick有另一种方法吗?
嗯,我在输出中需要的是一个rgb图像(不是png,可悲的是imagemagick正在创建一个png作为输出),其中包含隔行扫描的数据。更明确地说,cat
- 图像将使rgb图像平面交错(即rrrrrr ... ggggggg ... bbbbbbb)。我想要的是一个操作创建一个rgb图像行隔行扫描(即rrr ... ggg ... bbb ... rrr ... ggg ... bbb ... rrr ... ... GGG BBB ...)。很抱歉从一开始就不明确。
关于数据,它似乎是12 bpp或14 bpp little endian
答案 0 :(得分:2)
ImageMagick提供了一些技巧,但您需要负责定义标头中缺少的所有信息。像图像大小,量子深度和颜色空间的东西。
一种方法。
convert -size 70x46 -depth 8 \
r:imgPl0.raw g:imgPl1.raw b:imgPl2.raw \
-set colorspace RGB -combine -colorspace sRGB \
output.rgb
另一种选择是创建一个空白画布,并将原始文件中的数据复制到正确的画布通道。
convert -size 70x46 xc: -depth 8 \
r:imgPl0.raw -compose CopyRed -composite \
g:imgPl1.raw -compose CopyGreen -composite \
b:imgPl2.raw -compose CopyBlue -composite \
-colorspace sRGB output.rgb
可以找到其他示例here。
另请注意:我假设这些.raw
数据文件只包含单个通道样本,是无符号字符颜色大小,并且图像大小为70x46。 YMMV
<强>更新强>
嗯,我在输出中需要的是一个rgb图像(不是png,遗憾的是imagemagick正在创建一个png作为输出)
很抱歉。只需将output.png
切换为output.rgb
即可。 ImageMagick将完成剩下的工作。
关于数据,它似乎是12 bpp或14 bpp little endian
将-depth
从8调整为12或每部分14位。
还有一个-endian LSB
选项,但我认为不需要。
我想要的是一个操作,它正在创建一个rgb图像行隔行扫描
易。设置-interlace Line
选项。
所以......我之前的回答仍然有用,但只需要一些额外的选择。
convert -size 70x46 -depth 12 \
r:imgPl0.raw g:imgPl1.raw b:imgPl2.raw \
-set colorspace RGB -combine -colorspace sRGB \
-interlace Line output.rgb
或
convert -size 70x46 xc: -depth 12 \
r:imgPl0.raw -compose CopyRed -composite \
g:imgPl1.raw -compose CopyGreen -composite \
b:imgPl2.raw -compose CopyBlue -composite \
-colorspace sRGB -interlace Line output.rgb
希望你能够离开。
答案 1 :(得分:0)
如果你的数据是每个样本8位,你可以这样做,虽然不是很有效,不需要任何代码编写或编译或任何东西:
#!/bin/bash
# Bytes per row
bpr=100
row=0
# Loop through all rows of file
while :; do
# Read a row from each channel and output on stdout redirected to result.rgb
for ((chan=0;chan<3;chan++)); do
dd if=imgPl${chan}.raw bs=$bpr count=1 skip=$row > row.tmp 2> /dev/null
[ ! -s row.tmp ] && exit
cat row.tmp
done
((row+=1))
done > result.rgb