如何用Awk生成2像素BMP图像?

时间:2015-03-03 14:54:00

标签: image awk bitmap

抱歉这个愚蠢的问题,但我正在尝试使用Awk创建(生成)一个简单的BMP图像2x1,24位位图,像素格式为RGB24。

格式为“BitmapFileHeader(2 + 4 + 4 + 4 = 14字节)+ DIBHeader(4 + 4 + 4 + 2 + 2 + 4 + 4 + 4 + 4 + 4 + 4 = 40字节)= 54byte” ,然后开始像素阵列(位图数据)。这是我的简单脚本:

BEGIN {
ORS="";
filebmp="Image.bmp"
# BMP Header: 2+4+4+4=14 bytes
printf("%c%c",66,77)>filebmp;
printf("%c%c%c%c",62,0,0,0)>filebmp;
printf("%c%c%c%c",0,0,0,0)>filebmp;
printf("%c%c%c%c",54,0,0,0)>filebpm;

# DIB Header: 4+4+4+2+2+4+4+4+4+4+4=40 bytes
printf("%c%c%c%c",40,0,0,0)>filebmp;
printf("%c%c%c%c",2,0,0,0)>filebmp;
printf("%c%c%c%c",1,0,0,0)>filebmp;
printf("%c%c",1,0)>filebmp;
printf("%c%c",24,0)>filebmp;
printf("%c%c%c%c",0,0,0,0)>filebmp;
printf("%c%c%c%c",8,0,0,0)>filebmp;
printf("%c%c%c%c",19,11,0,0)>filebmp;
printf("%c%c%c%c",19,11,0,0)>filebmp;
printf("%c%c%c%c",0,0,0,0)>filebmp;
printf("%c%c%c%c",0,0,0,0)>filebmp;

# start of pixel array (bitmap data)
# Blu pixel
printf ("%c%c%c",127,0,0)>filebmp;
# Green pixel
printf ("%c%c%c",0,127,0)>filebmp;
# Padding
printf ("%c%c",0,0)>filebmp;
}

它的工作原理(下图):它生成一个2x1和62字节大小的BMP图像。

http://i60.tinypic.com/mlihyt.jpg

但是,现在,如果在位图数据中我用127替换127值(例如在蓝色像素中),相同的脚本Awk生成BMP图像2x1但是63字节大小和“其他颜色”(见下图)! / p>

http://i62.tinypic.com/2ltkjlg.png

我想知道我哪里出错...

......任何想法?

谢谢&再见

1 个答案:

答案 0 :(得分:2)

我能用gawk重现这个问题。似乎gawk根据您的LANG环境变量选择输出编码。 (这里我将127到128的实例都改变了。)

$ LANG=en_US.LATIN1 gawk -f bit.awk
$ wc -c Image.bmp
  62 Image.bmp

00000000: 424d 3e00 0000 0000 0000 3600 0000 2800  BM>.......6...(.
00000010: 0000 0200 0000 0100 0000 0100 1800 0000  ................
00000020: 0000 0800 0000 130b 0000 130b 0000 0000  ................
00000030: 0000 0000 0000 8000 0000 8000 0000       ..............

$ LANG=en_US.UTF-8 gawk -f bit.awk
$ wc -c Image.bmp
  64 Image.bmp

00000000: 424d 3e00 0000 0000 0000 3600 0000 2800  BM>.......6...(.
00000010: 0000 0200 0000 0100 0000 0100 1800 0000  ................
00000020: 0000 0800 0000 130b 0000 130b 0000 0000  ................
00000030: 0000 0000 0000 c280 0000 00c2 8000 0000  ................

以单字节编码运行gawk,你应该没问题。