hur.cn - 华软网

 热门搜索

如何从一个虚拟DC中使用GetPixel获取颜色信息?

  作者:未知    来源:网络    更新时间:2011/4/13
正常情况下,一般都是运用:

HDC     hDC = GetDC();
CClient dc(this);
.....

这些方法都跟窗口“绑定”了,也就是说如果你要从这个DC中掏出颜色信息,那么必需将其画出来,然后再取颜色信息,于是这个方法就有很大的“缺陷”了....


下面是我自己想到的一种思绪:
1、创建一个虚拟DC,再创建一个内存DC
2、在内存DC中输出图形
3、然后从内存DC中掏出颜色值


变量m_sz的值是正常的,而调用GetPixel后的color变量一直为背景致,求解?

C++">#include <windows.h>

#pragma comment(lib,"user32.lib")

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pszCmdLine, int cmdShow)
{
    // create a virtual dc to draw elements.
    HDC hdcScreen     = CreateDC("DISPLAY", NULL, NULL, NULL); 
    HDC hdcCompatible = CreateCompatibleDC(hdcScreen);
    CString     m_strText = _T("Hello");
    SIZE        m_sz;
    
    if(hdcCompatible == NULL)
    {
        MessageBox(NULL,_T("CreateCompatibleDC Failed !"),NULL,NULL);
        return NULL;
    }
    
    // then set the text color is black,the back color is white.
    SetBkColor(hdcCompatible,RGB(255,255,255));
SetTextColor(hdcCompatible,RGB(0,0,0));
    
    // draw the text int a virtual dc.
    TextOut(hdcCompatible,0,0,m_strText,m_strText.GetLength());

    // get the text width and height.
    GetTextExtentPoint32(hdcCompatible,m_strText,m_strText.GetLength(),&m_sz);
    
    // get the pixel infomation.
    for(int i=0; i<m_sz.cx; i++)
    {
        for(int j=0; j<m_sz.cy; j++)
        {
            COLORREF color = GetPixel(hdcCompatible,i,j);
            if(color == RGB(255,255,255)
            {
                // do something.
            }
            else
            {
                // do something.
            }
        }
    }
}

---华软 网友回答---
你这不就是“双缓冲”绘图吗,网上很多现成的例子
---华软网友回复---
引用 1 楼 king_hhuang 的回复:
你这不就是“双缓冲”绘图吗,网上很多现成的例子


这确实是双缓冲绘图,我现在的问题是GetPixel为什么会失利....

而直接输出到HWND显示,却又正常,难道GetPixel没法在内存DC中运用??
---华软网友回复---

if(color == RGB(255,255,255))
改成
if(GetRValue(color)==255&&GetGValue(color)==255&&GetBValue(color)==255)
---华软网友回复---
引用 3 楼 king_hhuang 的回复:

if(color == RGB(255,255,255))
改成
if(GetRValue(color)==255&amp;&amp;GetGValue(color)==255&amp;&amp;GetBValue(color)==255)


一样...
---华软网友回复---
引用 4 楼 wangningyu 的回复:
引用 3 楼 king_hhuang 的回复:


if(color == RGB(255,255,255))
改成
if(GetRValue(color)==255&amp;amp;&amp;amp;GetGValue(color)==255&amp;amp;&amp;amp;GetBValue(color)==255)


一样...


你试过啦?
我试过修改后的代码,能进if的判断里面
---华软网友回复---
如果真的想获得颜色信息,能够根据窗体左上角的坐标点在内存中的地址,然后算一下每一个color的巨细,再将GetPixel(,X,Y)中的X,Y换算过来,直接读,GetPixel()应该不能在你所说的“虚拟”DC中用,以前在嵌入式平台下通过这类方法获得的颜色信息
---华软网友回复---
创建DC之后,绘制之前,还要根据所需巨细CreateCompatibleBitmap、SelectObject。
---华软网友回复---
引用 7 楼 cnzdgs 的回复:
创建DC之后,绘制之前,还要根据所需巨细CreateCompatibleBitmap、SelectObject。


UP
---华软网友回复---
引用 7 楼 cnzdgs 的回复:
创建DC之后,绘制之前,还要根据所需巨细CreateCompatibleBitmap、SelectObject。


我也尝试了,不过整个BMP保存起来的全是黑色背景,没有所有文字....
---华软网友回复---
引用 9 楼 wangningyu 的回复:
我也尝试了,不过整个BMP保存起来的全是黑色背景,没有所有文字....

把尝试的代码贴出来看看。
---华软网友回复---
如果方便的话把你的代码贴出来让大伙看看啊,这样分析不出来什么毛病
---华软网友回复---
这个在纠结许久后终于自己换了种方法搞定,虽然大家都没帮上什么,但一样谢谢!      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。