弄了一天了,还是不对!跪求帮助!关于对24位bmp位图像素数据数组的问题!
本帖最后由 xyczy 于 2012-09-24 13:11:59 编辑 fread(&stBMPHeader, 1, sizeof(BITMAPFILEHEADER), hFile); //读取文件头
fread(&stBMPInfoHeader, 1, sizeof(BITMAPINFOHEADER), hFile); //读取位图信息头
if (stBMPHeader.bfType == 0x4D42) //这个是位图BMP的文件标识, 在这里判断是否为BMP文件
{
lpBitmapInfo = (BITMAPINFO*)new BYTE[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256];
if (stBMPInfoHeader.biBitCount == 8) //这里判断是否为8位位图, 如果是,则要把调色板读出来
{
fread(MainPalette, 1, sizeof(MainPalette), hFile);
}
//下面就是读取位图的像素数据了。
pByte = new BYTE[((((stBMPInfoHeader.biWidth * stBMPInfoHeader.biBitCount) + 31) / 32) * 4) * stBMPInfoHeader.biHeight];
fread(pByte, 1, ((((stBMPInfoHeader.biWidth * stBMPInfoHeader.biBitCount) + 31) / 32) * 4) * stBMPInfoHeader.biHeight, hFile);
BYTE *pByte2=pByte;
------------------------------------------------------
这是别人的一个代码,首先读取完成数据后通过 SetDIBitsToDevice(hDC, 0, 0, stBMPInfoHeader.biWidth, stBMPInfoHeader.biHeight, 0, 0,
0, stBMPInfoHeader.biHeight, pByte2, lpBitmapInfo, DIB_RGB_COLORS);
函数能正常显示图片
问题1:这个((((stBMPInfoHeader.biWidth * stBMPInfoHeader.biBitCount) + 31) / 32) * 4) * stBMPInfoHeader.biHeight每行的字节数算法能解释一下为什么要这样算吗,我的bmp是24位的,那每列字节数不是应该stBMPInfoHeader.biHeight*3吗为什么是stBMPInfoHeader.biHeight呢(这个算法能正确显示)
问题2:我想在显示前对图像数据进行处理
int width=(((stBMPInfoHeader.biWidth * stBMPInfoHeader.biBitCount) + 31) / 32) * 4;
int height=stBMPInfoHeader.biHeight*stBMPInfoHeader.biBitCount;
BYTE *pByte2=pByte;
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
{
if(i>=0&&i<=100&&j>=0&&j<=100)
{
pByte[width*i+j+2]-=20; //r
pByte[width*i+j+1]-=20; //g
pByte[width*i+j]-=20; //b
}
}
但是显示不正确如下图http://upload.gameres.com/20129/sf_24124956_9679.jpg,有人能告诉我i行j列的像素数据怎样表示吗
[最优解释]
pByte[nLineBytes*i + j*3] -= 20; //b
}
}
}
//
[其他解释]
((((stBMPInfoHeader.biWidth * stBMPInfoHeader.biBitCount) + 31) / 32) * 4)公式计算的是图像中每行像素所占的字节数;
有一点要注意的是BMP图像要求每行数据4字节对齐,所以才会有上面这个公式再乘以图像高度得到图像数据所占内存大小。
[其他解释]
这个我知道啊,我就是问公式怎么来的还有高度的字节数应该是biheight*3吧,24位的图哦
[其他解释]
int width=(((stBMPInfoHeader.biWidth * stBMPInfoHeader.biBitCount) + 31) / 32) * 4;
width 里就包含 *3;即 biBitCount
[其他解释]
你这个程序打开的是一个位图,就是后缀名为.bmp的图片.如果用于打开jpg图片当然不可能成功了,你看一下文件头里的bfType的值就知道了.
想试程序就截一幅位图吧,少年!!!
[其他解释]
3楼:stBMPInfoHeader.biWidth不是表示像素值吗我图片是600*400的,那这个值是600*3吗?
4楼:当然是bmp图而且我已经把效果图链接放在末尾了,而且能正常显示的,只是我想显示之前对像素进行一些操作不知道这个像素坐标对应的数组下标该怎么算
[其他解释]
厉害!真的对了,我再理清一下这个关系。只是修改后的显示在左下角,是因为bmp数据是从左下角开始显示的原因吗?分先给你了
[其他解释]
pByte[nLineBytes*(height-i-1)+j*3+2]-=20;
pByte[nLineBytes*(height-i-1)+j*3+1]-=20;
pByte[nLineBytes*(height-i-1)+j*3]-=20;
bingo!对图片格式又加深了感谢laoma_hbu!