在回调函数FrameCallBack中很容易得到每幅图像的数据区 可是是24位的位图 怎样转换为灰度图呢? 从csdn以往的帖子里找了很多方法 都不会用 有没有不用句柄 调色板 就可以转化过去的? 给个例子 多谢!!!这个是我找到的一个并自己改了改 改错了 哪位看看还可以用不
BOOL Bmp2Gry(LPBYTE CaptureData, LPBYTE *lpGrayData)
{
CClientDC dc(CWnd::GetDesktopWindow());
RGBQUAD rgb[256];
CBitmap bitmap;
bitmap.SetBitmapBits(320*240*3,CaptureData);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
memdc.SelectObject( &bitmap );
::GetDIBColorTable( memdc, 0, 256 , rgb ); int nBmpSize = 0;
nBmpSize = ((((320 * 24) + 31) & ~31) >> 3) * 240; if(*lpGrayData == NULL)
*lpGrayData = new BYTE[nBmpSize];
memset(*lpGrayData, 0, nBmpSize);
for(int i = 0; i < nBmpSize; i ++)
{
int nIndex = CaptureData[i];
double r = (double)(rgb[nIndex].rgbRed);
double g = (double)(rgb[nIndex].rgbGreen);
double b = (double)(rgb[nIndex].rgbBlue);
BYTE c = (BYTE)(r*0.29900 + g*0.58700 + b*0.11400);
int pos = ((240 - (i/320) - 1)*320) + (i % 320);
(*lpGrayData)[pos] = c;
}
delete []CaptureData;
CaptureData = NULL; return TRUE;
}
多谢!!
BOOL Bmp2Gry(LPBYTE CaptureData, LPBYTE *lpGrayData)
{
CClientDC dc(CWnd::GetDesktopWindow());
RGBQUAD rgb[256];
CBitmap bitmap;
bitmap.SetBitmapBits(320*240*3,CaptureData);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
memdc.SelectObject( &bitmap );
::GetDIBColorTable( memdc, 0, 256 , rgb ); int nBmpSize = 0;
nBmpSize = ((((320 * 24) + 31) & ~31) >> 3) * 240; if(*lpGrayData == NULL)
*lpGrayData = new BYTE[nBmpSize];
memset(*lpGrayData, 0, nBmpSize);
for(int i = 0; i < nBmpSize; i ++)
{
int nIndex = CaptureData[i];
double r = (double)(rgb[nIndex].rgbRed);
double g = (double)(rgb[nIndex].rgbGreen);
double b = (double)(rgb[nIndex].rgbBlue);
BYTE c = (BYTE)(r*0.29900 + g*0.58700 + b*0.11400);
int pos = ((240 - (i/320) - 1)*320) + (i % 320);
(*lpGrayData)[pos] = c;
}
delete []CaptureData;
CaptureData = NULL; return TRUE;
}
多谢!!
解决方案 »
- c++ 类设计的问题 满意即给分
- Xtreme Toolkit Pro v12.0.0 英文版的一个Bug
- 请教指针问题
- 一个存储过程按行返回数据,VC下怎样用ADO调用它?
- 怎样在一个连续调用的全局函数里调用CDC画图?
- 如何理解运行时(Runtime)?
- 请问如何让一个EXE程序, 当IE启动时它即启动, 当IE关闭时它即关闭 ?
- 怎样提取命令行提示符中获取的信息
- 请帮忙解决这个ado+datagrid的查询问题
- 我在MFC中迷了路!!! HELP! SOS!!!
- 如何使被调用的程序的窗口从开始运行即隐藏起来((QQ登录窗口))
- vfw编程 得到了每幅图像的数据区 将24位位图转换成灰度图 不会!!!!!
你也可以留邮箱下来,我把源码发给你
void CMultiphotohouseDoc::OnDetectlineCs()
{
// TODO: Add your command handler code here
int height,width;
int i,j,k;// 行列号,k值
BYTE gray[3],Gray;
height=GetPhotoHeight();//获得图片的高度
width=GetPhotoWidth();//获得图片的宽度
m_pGrayImg=new BYTE[width*height];
m_Photo.ReadGrayImageData(m_pGrayImg,0,0,height,width);
for(i=0;i<height-3;i++)
for(j=0;j<width;j++)
{
for(k=0;k<3;k++)
gray[k] = *(m_pGrayImg+i*width+j*3+k);
Gray=(BYTE)0.114*gray[0]+0.587*gray[1]+0.299*gray[2];
for(k=0;k<3;k++)
*(m_Photo.m_Photo.pData+i*3*width+j*3*3+k)=Gray;
}
UpdateAllViews(NULL);
delete m_pGrayImg;
}