从缓冲区中绘制bmp时出现意外结果

时间:2014-08-14 09:14:55

标签: c bitmap rendering bmp

我最后一次遇到问题是因为我以错误的方式交换了WIDTHHEIGHT。在那之后,我被告知正确的方式,我修复它。但是..今天我注意到这个功能没有像预期的一些bmp图像那样工作。

Comparement:

我从具有所有图像字节数据的缓冲区渲染图像。 并且有渲染的功能:

void bmp_bdraw (BYTE* BUFF)
{

    word WIDTH, HEIGHT, W, H; // word - unsigned short
    BYTE R, G, B; // BYTE - unsigned char

    (!BUFF || !BUFF[COUNT-1]) ? // debug1
        (error("Error in function 'bmp_bdraw'. There is no data to read from.")) : ;                  

    WIDTH = BUFF[18] + BUFF[19] * 256;
    HEIGHT = BUFF[22] + BUFF[23] * 256;
    ofs = 54;

    if(BUFF[0] != 'B' | BUFF[1] != 'M') error // debug2
        ("Warning: Data identifier error in function 'bmp_bdraw' occurred. Invalid BMP file loaded.");

    for(H=HEIGHT-1; H>=0; H--)
    {
        for(W=0; W<WIDTH; W++)
        {
            B = sgetc(BUFF); // fgetc-like function but from buff
            G = sgetc(BUFF);
            R = sgetc(BUFF);

            setpen(R, G, B, 0, 1); // sets the color, transparancy and size of the pen
            putpixel(W, H); // and puts the pixel at the right location
        }
    }

    if(W != WIDTH || H > 1) // debug3
        error("Error in function 'bmp_bdraw'. Rendering failed. The file might be damaged.");         

    if(real_fps < 11)
        error("Too low fps rate."); // debug4
}   

1 个答案:

答案 0 :(得分:0)

如果您的输入数据(BUFF缓冲区)正确则为
我和你分享我的观察结果,你可以进一步调试。

从(H(max),w(0))渲染到(H(0),w(max))。所以在一切都很好。图像很好但是当你的H(最大)减少输出图像变坏时。

简单来说,在顶部输出不好时,图像输出底部很好。看起来像素在顶部被踩到了。

我不明白setpen()是如何工作的。并且在处理之后你应该将该像素绘制在相同位置?

我认为随着H(最大)减少,您应该减少putpixel(W, H);中的W值我认为这将消除倾斜的垂直线和不良图像问题。