位图显示不正确

时间:2013-11-13 04:08:59

标签: c++ winapi

tagBITMAPFILEHEADER bh;
BITMAPINFOHEADER bih;
char buf[3];
unsigned char bmp[200][600];
int width ,height;
ifstream fin(L"D:\\xx\\3.bmp",ios::_Nocreate|ios::binary);
fin.read((char*)&bh,sizeof(bh));
fin.read((char*)&bih,sizeof(bih));


width=bih.biWidth;
height=bih.biHeight;
HWND myconsole=GetConsoleWindow();
HDC mydc=GetDC(myconsole);

for(int i=height;i>=1;i--)
    for(int j=1;j<=width;j++)
    {
        fin.read(buf,sizeof(buf));
        bmp[i][j*3]=buf[0];
        bmp[i][j*3+1]=buf[1];
        bmp[i][j*3+2]=buf[2];

    }
    for(int i=1;i<=height;i++)
    {
        for(int j=1;j<=width;j++)
        {
            COLORREF color;
            color=RGB(bmp[i][j*3],bmp[i][j*3+1],bmp[i][j*3+2]);
            SetPixel(mydc,j,i,color);
        }
        //cout<<width<<endl;
    }
    ReleaseDC(myconsole,mydc);
fin.close();
return 0;

source bmp display like this

我读取数组的像素,这个bmp的bitcount是24,所以我使用char [3]来存储数据, 但最终会像这样在控制台上显示,我无法理解。

1 个答案:

答案 0 :(得分:4)

位图图像数据行必须在32位边界上对齐。因此,您必须计算所需的填充量,并在每行末尾跳过该字节数。

通常,计算每行字节数和必须跳过的数字的公式为:

int rowBytes = ( (width * bytes_per_pixel) + 3 ) & ~3;
int skipBytes = rowBytes - (width * bytes_per_pixel);

然后在阅读文件时跳过每行末尾的skipBytes