HBITMAP   hbmp;   
EmptyClipboard();
::OpenClipboard(hWnd);
hbmp = (HBITMAP)::GetClipboardData(CF_BITMAP);

CStatic *pStatic = (CStatic*)(AfxGetApp()->m_pMainWnd->GetDlgItem(IDC_VIDEOANNY));
pStatic->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);  //设置样式位图并居中
pStatic->SetBitmap(hbmp); //设置静态控件显示位图上面是一段代码,剪贴板中有bmp图象的信息,我已经提出来了并显示到控件上..我的问题是如果我想把它变成灰度图再显示,中间处理怎么做?(变灰度的程序不需要)
我想知道的是怎么从HBITMAP得到信息,最后经过中间处理后再变回HTIMAP显示到控件上,
希望大家能帮帮忙,思路什么的都行

解决方案 »

  1.   

    通过位图HANDLE再构造新的位图,数据使用原始位图的数据经过变换后填充
    关于对HBITMAP的操作可以看MSDN,上面非常详细
      

  2.   

    在你获得HBITMAP后,访问该Bitmap的数据然后再设置就可以了吧
      

  3.   

    先GetDIBits,转换成灰度,再SetDIBits。
      

  4.   

    基本上就是操作BITMAP 函数簇看下这篇,跟你的需求类似,替换HBITMAP里面的颜色How to replace a color in a HBITMAPhttp://www.codeproject.com/KB/graphics/rplcolor.aspx
      

  5.   

    先用GetObject获取剪切板位图hbmp的大小位数等信息,
    再用GetBitmapBits获取数据,
    然后逐行处理数据(灰度公式sqrt(r*r+g*g+b*b)),SetBitmapBits替换回去
    最后pStatic->SetBitmap(hbmp); //设置静态控件显示位图 
      

  6.   

    如果是从真彩色到灰度BMP 那你不光是要设定下面BMP的数据就行的
    前面BMP的头也需要设定,所以整个过程下来你还是相当于做了一次BMP图像转换。
    所以还是干脆直接使用BMP的转换函数,再重新去获得一个句柄来的比较实在,
    代码支持也能找到,要按照你现在的方法弄下去还不知道会出来什么问题呢。
      

  7.   

    int GetDIBits(
      HDC hdc,           // handle to device context
      HBITMAP hbmp,      // handle to bitmap
      UINT uStartScan,   // first scan line to set in destination bitmap
      UINT cScanLines,   // number of scan lines to copy
      LPVOID lpvBits,    // address of array for bitmap bits
      LPBITMAPINFO lpbi, // address of structure with bitmap data
      UINT uUsage        // RGB or palette index
    );
    请问一下这个函数里面的LPBITMAPINFO 参数,我传进去一个BITMAPINFO变量,能得到hbmp句柄所在的图的信息吗
      

  8.   

    谢谢上面的朋友,还有个小问题咨询下,如果我转灰度的话,那么文件头属性里面的值我也需要修改,但是目前我只能改到信息头和数据的。我想问的是有什么方法可以让修改后文件头与HBITMAP相关联吗?SetBitmapBits只有信息和数据参数//拜托大家了
      

  9.   

    应该这样说,我由HBITMAP得到了信息头和数据头,修改后我可以用SetDIBits,但是我怎么把文件头提出来或是写进去呢?就这个问题,希望大家帮帮忙
      

  10.   

    或者说HBITMAP里面包含了什么数据,我能从里面得到BITMAPFILEHEADER文件头信息吗?
      

  11.   

    帖子总结:
    文件头是bmp文件才需要的,HBITMAP不需要文件头,所以没有关联