救急!!谁有24位BMP位图转换成256色位图的源代码?? 救急!!谁有24位BMP位图转换成256色位图的源代码?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 BITBLT里的最后一个参数就够你用了 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)是找到图像数据起始位置,你替换一下就行了。我分少,各位别和我抢分呀。 to wrcluomo(落木): 这是转成256级灰度图,是黑白的,有何用?? 试试颜色量化?http://www.cubic.org/~submissive/sourcerer/octree.htm#ot4 急! ToolBar的消息响应 随机霍夫变换检测圆,请各路大虾指点迷津 应该是个很简单的问题,不过搜了半天没有相关的答案,>>关于主线程等待子线程<< GetClientRect()的有关问题 delphi和VC混合编程遇到的问题(图像方面) 重绘函数Invalidate()怎么用?? 如何能成为一名出色的程序员? 这是什么错误?答对者马上给分! 程序中各种等号的意义 一个WinSocket作业,谁能用最简单的方式实现 如何向一个窗体发送将预设鼠标位置作为参数的右键点击消息? 在视图区动态生成BUTTON的问题
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)是找到图像数据起始位置,
你替换一下就行了。我分少,各位别和我抢分呀。
这是转成256级灰度图,是黑白的,有何用??
http://www.cubic.org/~submissive/sourcerer/octree.htm#ot4