从缓冲区渲染位图图像

时间:2014-06-06 21:46:00

标签: c bitmap bmp

我有一个使用fread将bmp数据复制到缓冲区类型byte** BUFF;的脚本 在动态位置调整后,我使用格式为BUFF[nImages][Data];的缓冲区。 那部分效果很好,但是......

问题是当我尝试渲染内容时。正如您在左侧所见,图像会弯曲。右边的图像是原始图像。 Right one is the original

我用来渲染图像的代码是:

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);
        }
    }
}

请注意,直接从文件呈现时,fseekfgetc的相同代码可以正常工作。我做错了什么?

更新

enter image description here

2 个答案:

答案 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作为高度