我有一个使用fread
将bmp数据复制到缓冲区类型byte** BUFF;
的脚本
在动态位置调整后,我使用格式为BUFF[nImages][Data];
的缓冲区。
那部分效果很好,但是......
问题是当我尝试渲染内容时。正如您在左侧所见,图像会弯曲。右边的图像是原始图像。
我用来渲染图像的代码是:
word ofs = 54;
byte sgetc (byte *str)
{
return str[ofs++];
}
void bmp_drawfbuff ()
{
word WIDTH, HEIGHT, W, H;
byte R, G, B;
HEIGHT = BMPDATA[0][18] + BMPDATA[0][19] * 256;
WIDTH = BMPDATA[0][22] + BMPDATA[0][23] * 256;
for(W=0; W<WIDTH; W++)
{
for(H=0; H<HEIGHT; H++)
{
B = sgetc(BMPDATA[0]);
G = sgetc(BMPDATA[0]);
R = sgetc(BMPDATA[0]);
setpen(R, G, B, 0, 1);
putpixel(W, H);
}
}
}
请注意,直接从文件呈现时,fseek
和fgetc
的相同代码可以正常工作。我做错了什么?
更新
答案 0 :(得分:2)
图片尺寸看起来有问题。
宽度小于应该的宽度。
尝试在此处交换WIDTH和WIDTH:
HEIGHT = BMPDATA[0][18] + BMPDATA[0][19] * 256;
WIDTH = BMPDATA[0][22] + BMPDATA[0][23] * 256;
然后,您需要在for
内交换计数器变量,我认为:
for(W=0; H<WIDTH; W++)
{
for(H=0; W<HEIGHT; H++)
{
<强>解释强>
Let's assume that you have 10x9 image:
1 2 3 4 5 6 7 8 9 10
1 --------------------
2 --[]----------------
3 --[]------------[]--
4 --[]------------[]--
5 --[][][][][][][][]--
6 ------[]------------
7 ------[]------------
8 ------[]------------
9 ------[]------------
在.bmp内部,它存储为1D数组:
----------------------[]------------------[]------------[]----[]------------[]----[][][][][][][][]--------[]------------------[]------------------[]------------------[]------------
如果您将其视为9x10图像(而不是10x9),您会看到:
------------------
----[]------------
------[]----------
--[]----[]--------
----[]----[][][][]
[][][][]--------[]
------------------
[]----------------
--[]--------------
----[]------------
垂直线|
变为对角线\
你对你的照片有同样的效果。
答案 1 :(得分:1)
http://en.wikipedia.org/wiki/BMP_file_format#Bitmap_file_header
给出偏移22处的高度 - 您正在读取偏移18作为高度