|
zeof(RGBQUAD)*256;
bitmapFileHeader->bfSize=bitmapFileHeader->bfOffBits+bitmapInfoHeader->biSizeImage;
//写数据
BYTE** newImageData=new BYTE*[bitmapInfoHeader->biHeight];
for (int i=0;ibiHeight;i++)
{
newImageData[i]=new BYTE[destImageLineByteCount];
}
for(int i=0;ibiHeight;i++)
{
for(int j=0;jbiHeight;i++)
{
for(int j=0;jbiHeight;i++)
{
for(int j=0;j
int srcImageLineByteCount=(((bitmapInfoHeader->biWidth*24)+31)/32)*4; int destImageLineByteCount=(((bitmapInfoHeader->biWidth)*8+31)/32)*4;
提醒:这里没有进行指针的释放。。。
这两行其实也可以用上一篇文章的WIDTHBYTES(bitmapInfoHeader->biWidth*24)和WIDTHBYTES(bitmapInfoHeader->biWidth*8)
有些地方也用( (bi.biWidth+3)/4 ) * 4和((bi.biWidth*3+3)/4)*4这样的表达式。。原理都是一样的。其实( (bi.biWidth+3)/4 ) * 4写成( (bi.biWidth*1+3)/4 ) * 4估计会好理解吧。。
因为BMP图像每个像素都是有三个RGB分量组成(24位,32位也就是多了个Alpha),而在灰度图像中每个像素只是一个灰度值,从代码:newImageData[i][j]=(int)((float)oldImageData[i][j*3]*0.114+(float)oldImageData[i][j*3+1]*0.587+(float)oldImageData[i][3*j+2]*0.299); 可看出,每个灰度值都是由原来的彩色图像的每个RGB分量通过一定的公式计算得来的。因此灰度图像和原来的彩色图像虽然在宽度和高度(像素单位)是一样的,但是因为组成不同,所以每行的字节数就是不一样的。。
至于其他的就不多说了,在前面WIDTHBYTES位图操作函数详解和BMP文件读写复习---C++实现文章中都说的差不多了,如果还有不明白的可以留言。。
效果如下:
原图像:

灰度图像:

|