各位大虾们好:
小弟弟网上搜到一个关于灰度化24位真彩图像的函数,可是不知道怎么用,不知道如何把它
嵌入到基于对话框模式下的程序中,不是变量没有定义,就是什么不知名的错误,由于我刚学
VC++不就,有限东西还不是很清楚,烦请各位大侠能够帮助小弟,以解燃眉之急!不胜感激!灰度化24位真彩图像程序如下:/*************************************************************************
* 函数名称:Gray24Bits(LPSTR lpDIB)
* 函数类型:HGLOBAL
* 参数: LPSTR lpDIB 指向dib的指针
* 函数功能:灰度化24位真彩图像
*************************************************************************/
HGLOBAL Gray24Bits(LPSTR lpDIB)
{
LPBITMAPINFOHEADER lpDIBHdr; // 指向BITMAPINFOHEADER的指针
lpDIBHdr = (LPBITMAPINFOHEADER)lpDIB;
LPSTR lpGray; // 计算位图图的信息头、调色板和图形数据的大小, 并给灰度图分配内存
int dwInfo = lpDIBHdr->biSize;
int dwData = lpDIBHdr->biSizeImage;
int dwGrayData = dwData/3;
int dwGrayPal = 256 * sizeof(RGBQUAD);
dwData=(lpDIBHdr->biHeight) * (lpDIBHdr->biWidth);
int sizeTotal=dwInfo+dwGrayPal+dwData; //灰度图,颜色表长度为255
HGLOBAL hGray=(HGLOBAL)::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeTotal);
if (hGray==0)
{
return false; //内存分配失败则返回false
}
lpGray = (LPSTR) ::GlobalLock(hGray); // 创建灰度图的颜色表 计算每个像素点的灰度值,即求平均即可
RGBQUAD* lpGrayRgbQuag=(RGBQUAD*)(lpGray+lpDIBHdr->biSize); char * lpBits = lpDIB + lpDIBHdr->biSize ;
int rowLenSr=WIDTHBYTES(24*lpDIBHdr->biWidth);
int rowLenDes=WIDTHBYTES(8*lpDIBHdr->biWidth);
BYTE * lpGrayBits = (BYTE*)(lpGrayRgbQuag)+dwGrayPal;
int aver=0;
int i,j,k; if(24==lpDIBHdr->biBitCount)
{
for(i=0;i<256;i++)
{
lpGrayRgbQuag->rgbBlue=i;
lpGrayRgbQuag->rgbGreen=i;
lpGrayRgbQuag->rgbRed=i;
lpGrayRgbQuag->rgbReserved=0;
lpGrayRgbQuag++;
}
for (i=0;i<lpDIBHdr->biHeight;i++)
{
for (j=0; j<lpDIBHdr->biWidth; j++)
{
k=i*rowLenSr+3*j;/*
lpGrayBits[i*rowLenDes+j]=(BYTE)(0.114*lpBits[k]
+ 0.587*lpBits[k+1]
+ 0.299*lpBits[k+2] + 0.5);*/ lpGrayBits[i*rowLenDes+j]=(BYTE) (( 117 * lpBits[k]
+ 601 * lpBits[k+1]
+ 306 * lpBits[k+2] + 512 ) >> 10 ); //修改后的优化算法
}
//修正需要补零的像素行
for (j=lpDIBHdr->biWidth;j<rowLenDes;j++)
{
lpGrayBits[i*rowLenDes+j]=0;
} }
} // 创建灰度图的信息头
LPBITMAPINFOHEADER lpGrayHdr=(LPBITMAPINFOHEADER)lpGray;
memcpy(lpGrayHdr, lpDIBHdr, dwInfo); lpGrayHdr->biSizeImage=sizeTotal;
lpGrayHdr->biBitCount=8;
lpGrayHdr->biClrUsed=256; ::GlobalUnlock( hGray );
return (HGLOBAL) hGray;
}
小弟弟网上搜到一个关于灰度化24位真彩图像的函数,可是不知道怎么用,不知道如何把它
嵌入到基于对话框模式下的程序中,不是变量没有定义,就是什么不知名的错误,由于我刚学
VC++不就,有限东西还不是很清楚,烦请各位大侠能够帮助小弟,以解燃眉之急!不胜感激!灰度化24位真彩图像程序如下:/*************************************************************************
* 函数名称:Gray24Bits(LPSTR lpDIB)
* 函数类型:HGLOBAL
* 参数: LPSTR lpDIB 指向dib的指针
* 函数功能:灰度化24位真彩图像
*************************************************************************/
HGLOBAL Gray24Bits(LPSTR lpDIB)
{
LPBITMAPINFOHEADER lpDIBHdr; // 指向BITMAPINFOHEADER的指针
lpDIBHdr = (LPBITMAPINFOHEADER)lpDIB;
LPSTR lpGray; // 计算位图图的信息头、调色板和图形数据的大小, 并给灰度图分配内存
int dwInfo = lpDIBHdr->biSize;
int dwData = lpDIBHdr->biSizeImage;
int dwGrayData = dwData/3;
int dwGrayPal = 256 * sizeof(RGBQUAD);
dwData=(lpDIBHdr->biHeight) * (lpDIBHdr->biWidth);
int sizeTotal=dwInfo+dwGrayPal+dwData; //灰度图,颜色表长度为255
HGLOBAL hGray=(HGLOBAL)::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeTotal);
if (hGray==0)
{
return false; //内存分配失败则返回false
}
lpGray = (LPSTR) ::GlobalLock(hGray); // 创建灰度图的颜色表 计算每个像素点的灰度值,即求平均即可
RGBQUAD* lpGrayRgbQuag=(RGBQUAD*)(lpGray+lpDIBHdr->biSize); char * lpBits = lpDIB + lpDIBHdr->biSize ;
int rowLenSr=WIDTHBYTES(24*lpDIBHdr->biWidth);
int rowLenDes=WIDTHBYTES(8*lpDIBHdr->biWidth);
BYTE * lpGrayBits = (BYTE*)(lpGrayRgbQuag)+dwGrayPal;
int aver=0;
int i,j,k; if(24==lpDIBHdr->biBitCount)
{
for(i=0;i<256;i++)
{
lpGrayRgbQuag->rgbBlue=i;
lpGrayRgbQuag->rgbGreen=i;
lpGrayRgbQuag->rgbRed=i;
lpGrayRgbQuag->rgbReserved=0;
lpGrayRgbQuag++;
}
for (i=0;i<lpDIBHdr->biHeight;i++)
{
for (j=0; j<lpDIBHdr->biWidth; j++)
{
k=i*rowLenSr+3*j;/*
lpGrayBits[i*rowLenDes+j]=(BYTE)(0.114*lpBits[k]
+ 0.587*lpBits[k+1]
+ 0.299*lpBits[k+2] + 0.5);*/ lpGrayBits[i*rowLenDes+j]=(BYTE) (( 117 * lpBits[k]
+ 601 * lpBits[k+1]
+ 306 * lpBits[k+2] + 512 ) >> 10 ); //修改后的优化算法
}
//修正需要补零的像素行
for (j=lpDIBHdr->biWidth;j<rowLenDes;j++)
{
lpGrayBits[i*rowLenDes+j]=0;
} }
} // 创建灰度图的信息头
LPBITMAPINFOHEADER lpGrayHdr=(LPBITMAPINFOHEADER)lpGray;
memcpy(lpGrayHdr, lpDIBHdr, dwInfo); lpGrayHdr->biSizeImage=sizeTotal;
lpGrayHdr->biBitCount=8;
lpGrayHdr->biClrUsed=256; ::GlobalUnlock( hGray );
return (HGLOBAL) hGray;
}
你的工程里有没有和DIB相关的东西