我现在想由彩色的BMP转换位256灰度图像,具体算法是:0.3*r+0.59*g+0.11*b
,现在问题是如何根据要得到的灰度图像的长,宽来构造一个BMP文件头(此时不能用彩色图像的HDIB,因为它是彩色图像的文件头)。由了文件头我才能保存转换后的灰度图像。我只想了这个函数的框架,情高手帮忙吧这个函数填好!
/*
* 返回文件头的指针,h:图像高,w:图像宽
*/
VOID * CreateGrayBMPHeader(int h,int w)
{}谢谢大家,最好由源码?

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/3117/3117382.xml?temp=7.274806E-03可以参考,需要程序给我留言,,
    哪个论坛的帖子坏了!
      

  2.   

    这是我参考一个网上朋友的,运行没错,但是保存成文件时,文件位空,大家能否帮我看看那儿的错误啊?
    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;
    }