我有一个脚本,它使用 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
的相同代码可以工作。我做错了什么?
更新:
最佳答案
图像尺寸似乎有问题。
宽度小于应有的宽度。
尝试在此处交换 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 中,它存储为一维数组:
----------------------[]------------------[]------------[]----[]------------[]----[][][][][][][][]--------[]------------------[]------------------[]------------------[]------------
如果您将其视为 9x10 图像(而不是 10x9),您会看到以下内容:
------------------
----[]------------
------[]----------
--[]----[]--------
----[]----[][][][]
[][][][]--------[]
------------------
[]----------------
--[]--------------
----[]------------
垂直线|
变成对角线\
。
你的照片也有同样的效果。
关于c - 从缓冲区渲染位图图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24091096/