我现在想由彩色的BMP转换位256灰度图像,具体算法是:0.3*r+0.59*g+0.11*b
,现在问题是如何根据要得到的灰度图像的长,宽来构造一个BMP文件头(此时不能用彩色图像的HDIB,因为它是彩色图像的文件头)。由了文件头我才能保存转换后的灰度图像。我只想了这个函数的框架,情高手帮忙吧这个函数填好!
/*
* 返回文件头的指针,h:图像高,w:图像宽
*/
VOID * CreateGrayBMPHeader(int h,int w)
{}谢谢大家,最好由源码?
,现在问题是如何根据要得到的灰度图像的长,宽来构造一个BMP文件头(此时不能用彩色图像的HDIB,因为它是彩色图像的文件头)。由了文件头我才能保存转换后的灰度图像。我只想了这个函数的框架,情高手帮忙吧这个函数填好!
/*
* 返回文件头的指针,h:图像高,w:图像宽
*/
VOID * CreateGrayBMPHeader(int h,int w)
{}谢谢大家,最好由源码?
哪个论坛的帖子坏了!
HDIB MakeGrayFile(HDIB pColorBmp,long nDisplayHeight,long nDisplayWidth)
{
//将RGB模式的位图转换为256色灰度位图
long BmpLength = WIDTHBYTES(8*nDisplayWidth)*nDisplayHeight + sizeof(RGBQUAD)*256;// + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
HDIB hGrayDIB = (HDIB)::GlobalAlloc(GHND,BmpLength+sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER));
LPSTR pGrayDIB = (LPSTR)GlobalLock((HGLOBAL)hGrayDIB);
LPSTR pColorDIB = (LPSTR)GlobalLock((HGLOBAL)pColorBmp); char *pgray = new char[BmpLength];
LPSTR read = ::FindDIBBits(pColorDIB);//(char*)pColorBmp + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) ;
char *write = pgray; //构造调色板信息
for(int i=0;i<256;i++)
{
*(write+i*4) = i;
*(write+i*4+1) = i;
*(write+i*4+2) = i;
*(write+i*4+3) = 0;
}
write += sizeof(RGBQUAD)*256; //指针条到象素数据区 int r,g,b;
float Y;
BYTE gray;
for(int h=0;h<nDisplayHeight;h++)
{
for(int w=0;w<nDisplayWidth;w++)
{
g = (unsigned char)*read++;
b = (unsigned char)*read++;
r = (unsigned char)*read++;
//提取灰度分量
Y=(float)(r*0.299+g*0.587+b*0.114);
gray = (BYTE)Y;
*write = gray;
write++;
}
} //拷贝新的灰度位图调色板信息和像素数据
//设置位图文件头
BITMAPFILEHEADER bmfHdr;
bmfHdr.bfType = DIB_HEADER_MARKER;//0x4D41;//2; // "BM"
//BmpLength = bmfHdr.bfSize = nDisplayWidth*nDisplayHeight + sizeof(RGBQUAD)*256 + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmfHdr.bfSize = (DWORD)WIDTHBYTES(8*nDisplayWidth)*nDisplayHeight + (DWORD)(sizeof(RGBQUAD)*256) + (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER);
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)
+ (DWORD)sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256;
//拷贝位图文件头
memcpy(pGrayDIB, &bmfHdr, sizeof(BITMAPFILEHEADER)); //设置位图信息头
BITMAPINFOHEADER bi;
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = nDisplayWidth;
bi.biHeight = nDisplayHeight;
bi.biPlanes = 1;
bi.biBitCount = 8;
bi.biCompression = BI_RGB;
bi.biSizeImage = WIDTHBYTES(8*nDisplayWidth)*nDisplayHeight;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
memcpy(pGrayDIB + sizeof(BITMAPFILEHEADER), &bi, sizeof(BITMAPINFOHEADER)); //拷贝新的灰度位图调色板信息和像素数据
memcpy(pGrayDIB + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER),
pgray, BmpLength);
//释放分配的临时空间
delete pgray;
GlobalUnlock((HGLOBAL)hGrayDIB);
return hGrayDIB;
}