救急!!谁有24位BMP位图转换成256色位图的源代码??

解决方案 »

  1.   

    BITBLT里的最后一个参数就够你用了
      

  2.   


    void defLianBiao::TurnToGrey(LPSTR lpDib)
    {
    LPSTR   lpNewDIBBits;// 指向DIB灰度图图像开始处象素的指针
    unsigned char * ired;
    unsigned char * igreen;
    unsigned char * iblack;
    long i,j;// 循环变量
    unsigned char * lpdest;
    //lpdest=(unsigned char *)::malloc(lHeight*lWidth);
    lpdest= new unsigned char [lHeight*lWidth];
    int n=0;
    int PictureBits;
    PictureBits=DIBBits(lpDib)/8;
    if (PictureBits==0)//||PictureBits<=1)//不处理非整数字节的图像格式
    {
    AfxMessageBox("不支持该图像的数据格式");
    return;
    }
    RGBQUAD *lpRGBquad;
    lpRGBquad=(RGBQUAD *)&lpDib[sizeof(BITMAPINFOHEADER)];//位图信息头后面为调色板
    unsigned char* lpSrc;
    n=0;
    if(PictureBits==1)//256色彩色位图
    for(j=0;j<lHeight;j++)
    for(i=0;i<lWidth;i++)
    {
    lpSrc = (unsigned char*)lpDIBBits + lLineBytes * j + i;
    ired= &lpRGBquad[*lpSrc].rgbRed;
    igreen =& lpRGBquad[*lpSrc].rgbGreen;
    iblack = &lpRGBquad[*lpSrc].rgbBlue;
    lpdest[n] =(unsigned char)(0.299*(*ired)+0.587*(*igreen)+0.114*(*iblack));
    n++;
    }
    else//24/32位彩色位图
    {

    lLineBytes=WIDTHBYTES(lWidth * 8*PictureBits);
    for (j=0;j<lHeight;j++)
    for(i=0,n=0;i<PictureBits*lWidth;i+=PictureBits,n++)
    {

    ired= (unsigned char*)lpDIBBits + lLineBytes *j+i+2;
    igreen = (unsigned char*)lpDIBBits+lLineBytes *j+i+1;
    iblack = (unsigned char*)lpDIBBits +lLineBytes *j+i;
    lpdest[j*lWidth+n] =(unsigned char)(0.299*(*ired)+0.587*(*igreen)+0.114*(*iblack));

    }
    }
    LPBITMAPINFOHEADER lpBI;//位图信息头
    // 读取BITMAPINFO结构,初始化指针
    lpBI = (LPBITMAPINFOHEADER)lpDib;//[sizeof(BITMAPFILEHEADER)];
    lpBI->biBitCount=8;
    //设置256色灰度调色板
    for (i = 0; i < 256; i++)
    {
    lpRGBquad[i].rgbRed =(unsigned char)i;// 读取红色分量
    lpRGBquad[i].rgbGreen =(unsigned char)i;// 读取绿色分量
    lpRGBquad[i].rgbBlue = (unsigned char)i;// 读取红色分量
    lpRGBquad[i].rgbReserved = 0;// 保留位
    }
    lpNewDIBBits= ::FindDIBBits(lpDib);// 找到DIB图像象素起始位置
    lLineBytes=WIDTHBYTES(lWidth * 8);
    for(j=0;j<lHeight;j++)
    for(i=0;i<lWidth;i++)
    {


    lpSrc=(unsigned char*)lpNewDIBBits+lLineBytes*j+i;
    *lpSrc=lpdest[j*lWidth+i];
    }
    //::free((void *)lpdest);
    delete lpdest;
    }
    需作一点修改比如FindDIBBits(lpDib)是找到图像数据起始位置,
    你替换一下就行了。我分少,各位别和我抢分呀。
      

  3.   

    to wrcluomo(落木):
       这是转成256级灰度图,是黑白的,有何用??
      

  4.   

    试试颜色量化?
    http://www.cubic.org/~submissive/sourcerer/octree.htm#ot4