荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店