荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: oopilix ([0;1;32;40m), 信区: Visual
标  题: [zl]一个各种颜色转换成灰度图的函数
发信站: 荔园晨风BBS站 (Mon Oct 13 23:27:15 2003), 站内信件


void GrayConversionXu(HDIB& hDib)

{

//预备生成空白的DIB以保存灰度图像

HDIB hGreyDIB=NULL;

DWORD nWide,nHeight,i,j;



//读取原DIB中的有关信息以取得生成的DIB需要多大的空间

LPBYTE lpBit=(LPBYTE)GlobalLock(hDib);

LPBITMAPINFOHEADER pHeader=(LPBITMAPINFOHEADER)lpBit;

nWide=pHeader->biWidth;

nHeight=pHeader->biHeight;

DWORD dGrayDIBSize;



if(IS_WIN30_DIB(lpBit))

dGrayDIBSize=pHeader->biSize+256*sizeof(RGBQUAD)+(nWide*8+31)/32*4*nHeig
ht;

else

dGrayDIBSize=pHeader->biSize+256*sizeof(RGBTRIPLE)+(nWide*8+31)/32*4*nHe
ight;

//上面是计算所占空间的,头部+色表+像素部分

hGreyDIB=(HDIB)GlobalAlloc(GHND,dGrayDIBSize);



//颜色表初始化

LPBITMAPINFO lpGray=(LPBITMAPINFO)GlobalLock(hGreyDIB);

lpGray->bmiHeader=*pHeader;

lpGray->bmiHeader.biBitCount=8;

if(IS_WIN30_DIB(lpBit))

for(i=0;ibmiColors[i].rgbBlue=(BYTE)i;

lpGray->bmiColors[i].rgbGreen=(BYTE)i;

lpGray->bmiColors[i].rgbRed=(BYTE)i;

lpGray->bmiColors[i].rgbReserved=(BYTE)0;

}

else

for(i=0;ibmiColors[i].rgbBlue=(BYTE)i;

lpGray->bmiColors[i].rgbGreen=(BYTE)i;

lpGray->bmiColors[i].rgbRed=(BYTE)i;

}

LPBYTE lpGrayBit=(LPBYTE)lpGray;

//上面的是定义了一个指针目前指向DIB的头部吧



if(IS_WIN30_DIB(lpBit))

lpGrayBit+=pHeader->biSize+256*sizeof(RGBQUAD);

else

lpGrayBit+=pHeader->biSize+256*sizeof(RGBTRIPLE);

加上偏移就指向了像素的地址了.

int nCountBit=pHeader->biBitCount;

色彩的位数

if(nCountBit>8)

{

lpBit+=sizeof(BITMAPINFOHEADER);

//一条扫描线一条扫描线的进行处理的.

//下面的两个变量可能是一个偏移主要可能是24位可能不要偏移,32位还有一个8位
的偏移

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);

}

//上面是对256以上色的处理

else

{

DWORD nColorCount=1<<nCountBit;

BYTE pGreyTable[256];

RGBQUAD pDIBColors[256];

LPBITMAPINFO lpBitmapinfo=(LPBITMAPINFO)lpBit;

for(i=0;i<nColorCount;i++)

{

if(IS_WIN30_DIB(lpBit))

{

pDIBColors[i].rgbBlue=lpBitmapinfo->bmiColors[i].rgbBlue;

pDIBColors[i].rgbGreen=lpBitmapinfo->bmiColors[i].rgbGreen;

pDIBColors[i].rgbRed=lpBitmapinfo->bmiColors[i].rgbRed;

pDIBColors[i].rgbReserved=lpBitmapinfo->bmiColors[i].rgbReserved;

}

else

{

pDIBColors[i].rgbBlue=lpBitmapinfo->bmiColors[i].rgbBlue;

pDIBColors[i].rgbGreen=lpBitmapinfo->bmiColors[i].rgbGreen;

pDIBColors[i].rgbRed=lpBitmapinfo->bmiColors[i].rgbRed;

}

pGreyTable[i]=pDIBColors[i].rgbBlue*0.114+pDIBColors[i].rgbRed*0.
299+pDIBColors[i].rgbGreen*0.587;

}

lpBit=lpBit+sizeof(BITMAPINFOHEADER)+PaletteSize(lpBit);

int nRGB=(nWide*nCountBit+31)/32*4-(nWide*nCountBit)/8;

int nGrey=(nWide*8+31)/32*4-nWide;

switch(nColorCount)

{

case 2:

for(i=0;i<nHeight;i++)

{

for(j=0;j<nWide;j++)

{

BYTE n=1<<(7-j%8);

BYTE Temp=*(BYTE*)lpBit;

Temp&=n;

*lpGrayBit++=pGreyTable[Temp>>(7-j%8)];

if((j+1)%8==0)lpBit++;

}

lpGrayBit+=nGrey;

lpBit+=nRGB;

}



break;

case 16:

//在我印像中还要分332A,和232之类的格式的.

for(i=0;i(j%2 ?0:4);

*lpGrayBit++=pGreyTable[Temp];

if((j+1)%2==0)lpBit++;

}

lpGrayBit+=nGrey;

lpBit+=nRGB;

}

break;

case 256:

//只处理基于调色板的DIB吗?

//好像有不是调色板的256色的图像的565或者是555A

for(i=0;i<nHeight;i++)

{

for(j=0;j<nWide;j++)

*lpGrayBit++=pGreyTable[(*lpBit++)];

lpGrayBit+=nGrey;

lpBit+=nRGB;

}



break;

}

::GlobalUnlock((HGLOBAL)hDib);

::GlobalFree((HGLOBAL)hDib);

hDib = hGreyDIB;

::GlobalUnlock((HGLOBAL)hGreyDIB);

}

}





--

 ※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM:oopilix.bbs@bbs.szu.edu.cn]
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 61.144.235.39]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店