请看图片为什么会这样子,我只是想转化成灰度,天居然这样对我:(
http://www.3-sky.com/mt/ihqq/Snap1.bmp
http://www.3-sky.com/mt/ihqq/Snap2.bmp
用的是前几天一个兄弟的代码
LPBYTE lpGrayBit=(LPBYTE)lpGray;
if(IS_WIN30_DIB(lpBit))
{
lpGrayBit+=pHeader->biSize+256*sizeof(RGBQUAD);//将指针移到新建的灰度图像的数据区
lpBit+=sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);//这个移到原来图像的数据区
}
else
{
lpGrayBit+=pHeader->biSize+256*sizeof(RGBTRIPLE);
    lpBit+=sizeof(BITMAPINFOHEADER)+256*sizeof(RGBTRIPLE);
}
int nCountBit=pHeader->biBitCount;

if(nCountBit>8)//if biBitCount great eight then translate
{
int nRGB=(nWide*nCountBit+31)/32*4-nWide*nCountBit/8;
int nGrey=(nWide*8+31)/32*4-nWide;
for(i=0;i<nHeight;i++)
{
for(j=0;j<nWide;j++)
*lpGrayBit++=(*lpBit++)*0.299+(*lpBit++)*0.587+(*lpBit++)*0.114;
lpGrayBit+=nGrey;
lpBit+=nRGB;
}
::GlobalUnlock((HGLOBAL)hDib);
::GlobalFree((HGLOBAL)hDib);
hDib = hGreyDIB;
::GlobalUnlock((HGLOBAL)hGreyDIB);
}//下面的代码没有用到

解决方案 »

  1.   

    我的图像是真彩色的24,没有调色板上面代码不对,(应该能看出吧)
    if(IS_WIN30_DIB(lpBit))
    lpGrayBit+=pHeader->biSize+256*sizeof(RGBQUAD);
        else
    lpGrayBit+=pHeader->biSize+256*sizeof(RGBTRIPLE);
    int nCountBit=pHeader->biBitCount;

    if(nCountBit>16)//if biBitCount great eight then translate
    {
            lpBit+=sizeof(BITMAPINFOHEADER);
    int nRGB=(nWide*nCountBit+31)/32*4-nWide*nCountBit/8;
    int nGrey=(nWide*8+31)/32*4-nWide;
    for(i=0;i<nHeight;i++)
    {
    for(j=0;j<nWide;j++)
    *lpGrayBit++=(*lpBit++)*0.299+(*lpBit++)*0.587+(*lpBit++)*0.114;
    lpGrayBit+=nGrey;
    lpBit+=nRGB;
    }
    ::GlobalUnlock((HGLOBAL)hDib);
    ::GlobalFree((HGLOBAL)hDib);
    hDib = hGreyDIB;
    ::GlobalUnlock((HGLOBAL)hGreyDIB);
    }
    图像变成了这样子
    http://www.3-sky.com/mt/ihqq/Snap3.bmp
    从中间分开了
      

  2.   

    像素的起始位置算得不对吧,BitCount > 8 的图像不用调色板的
      

  3.   

    BitCount > 8 的图像不用调色板,其余的分别占颜色数*4个字节
      

  4.   

    能灰度化说明你的算法基本是对的,移位了可能像上面说的定位错了,看看指针所指的位图数据与原图是否一致?你可以用ultraedit来查图象数据