Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 如何使用Awk生成2像素BMP图像?_Image_Awk_Bitmap - Fatal编程技术网

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

Image 如何使用Awk生成2像素BMP图像?,image,awk,bitmap,Image,Awk,Bitmap,很抱歉这个愚蠢的问题,但我正在尝试使用Awk创建(生成)一个简单的BMP图像2x1,像素格式为RGB24的24位位图 格式为“BitmapFileHeader(2+4+4+4=14字节)+DIBHeader(4+4+4+2+2+4+4+4+4=40字节)=54字节”,然后开始像素阵列(位图数据)。以下是我的简单脚本: BEGIN { ORS=""; filebmp="Image.bmp" # BMP Header: 2+4+4+4=14 bytes printf("%c%c",66,77)>

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

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

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;
}
它的作品(下图):它生成一个BMP图像2x1和62字节大小

但是,现在,如果在位图数据中,我将127值替换为128(例如,蓝色像素),则同一脚本Awk将生成一个BMP图像2x1,但大小为63字节,并带有“其他颜色”(见下图)

我不知道我错在哪里

……有什么想法吗


谢谢&再见

我可以用呆呆的眼神再现这个问题。gawk似乎根据您的
LANG
环境变量选择输出编码。(这里我将127的两个实例都更改为128。)


在单字节编码下运行gawk,您应该不会有问题。

我在您发布时运行了您的脚本,然后再次使用128而不是127,无法重现问题。这两个结果都是62个字符,二进制差异仅显示了预期的0x80,其中0x7F已被删除。我确实注意到您发布的内容中有一个输入错误:
filebpm
,而不是其中一个文件名的
filebmp
。你确定你发布的内容就是你正在运行的内容吗?(这本身并不能解释您看到的内容。)此外,
man ascii
将向您显示
127
是表中最后一个
%c
值。因此,不能确定为
%c
定义了128。awk的有趣问题使用。祝你好运哦,我在您的输出十六进制字节中看到了,它恰好是0x80(十进制128)控制字符的UTF8编码。我想我们正在取得进展……你到底为什么要用
awk
?LANG环境变量被设置为LANG=it\u it.UTF8。我已经将LANG本地化从it_it.UTF8更改为it_IT@euroe现在它起作用了。我真的很感谢大家加入我这个“小问题”的讨论。很棒的分析。使用
LC_ALL=C gawk-f bit.awk可能是最可靠的方法。值得注意的是,BSD
awk
mawk
都没有表现出这种行为。
$ 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  ................