无法显示比CDC区域更高分辨率的位图

时间:2010-05-14 09:24:03

标签: c++ mfc cdc cbitmap

亲爱的大师和专家编码员。

我不会从一个新手开始,对图像编程知之甚少但不幸的是这些是事实:(

我正在尝试从位图指针* ImageData显示分辨率的图像 1392x1032。我试图在分辨率或大小为627x474的区域绘制它。

然而,反复尝试似乎没有用。当我将我创建的位图图像从* ImageData宽度和高度更改为分辨率或大小约627x474

时,它可以工作

在尝试各种论坛和谷歌的所有可能的解决方案后,我真的不知道如何解决这个问题。

pDC是CDC *,memDC是在早期方法中初始化的CDC 这里未初始化的任何东西都是用其他方法初始化的。

这是我的代码亲爱的谦逊的大师。向我提供尤达和欧比万为卢克天行者提供的指导。

void DemoControl::ShowImage( void *ImageData )
{


    int Width; //Width of Image From Camera
    int Height; //Height of Image From Camera

    int m_DisplayWidth = 627 ;//width of rectangle area to display
    int m_DisplayHeight = 474;//height of rectangle area to display

    GetImageSize( &Width, &Height ) ; //this will return Width = 1392, Height 1032

    CBitmap bitmap;

    bitmap.CreateBitmap(Width,Height,32,1,ImageData);

    CBitmap* pOldBitmap = memDC.SelectObject((CBitmap*)&bitmap);

    pDC->BitBlt(22, 24, 627, 474, &memDC, 0, 0, SRCCOPY);

    memDC.SelectObject((CBitmap*)pOldBitmap);

    ReleaseDC(pDC);

}

好的,还有一些额外的部分

我想我应该解释一下流程是怎么回事。

(a)一个类(比方说DemoTestingDlg类)将CDC如下传递给另一个类(比如说DemoControl类)

m_Demo = new DemoControl ; 

m_Demo->Initialisation( this, this->GetDC() ) ; 

(b)在DemoControl类

bool DemoControl :: Initialisation(CDemoTestingDlg m_FormControl,CDC m_StaticDisplay){

          pDC = m_StaticDisplay ; 
          memDC.CreateCompatibleDC(pDC); 

}

pDC和memDC在标题中是这样的:

CDC* pDC ; CDC memDC; 

(c)如果让我们说一个图像被捕获,那么图像指针将被传递给DemoTestingDlg类,该类随后会在Demo Control Class中调用showImage方法,这是我在问题中写的方法。我做得对吗?

注意:它确实显示了一个图像,如果我们说它们的大小相同(我指的是CDC和位图),所以我的印象是我的CDC指针正确传递

2 个答案:

答案 0 :(得分:1)

StretchBlt是你的朋友:)

编辑:好的,你怎么得到pDC?你的函数何时被调用?表单OnPaint或DrawItem?

这是一个StretchBlt,我通过重写CStatic中的DrawItem调用来做。

HDC hBitmapDC   = CreateCompatibleDC( pDrawItemStruct->hDC );

HBITMAP hBitmap = GetBitmap();
HGDIOBJ hOld    = SelectObject( hBitmapDC, (HGDIOBJ)hBitmap );

StretchBlt( pDrawItemStruct->hDC, pDrawItemStruct->rcItem.left, pDrawItemStruct->rcItem.top, pDrawItemStruct->rcItem.right, pDrawItemStruct->rcItem.bottom,
            hBitmapDC, 0, 0, 4, 4, SRCCOPY );

SelectObject( hBitmapDC, hOld );
DeleteObject( hBitmapDC );

它没有使用MFC类将4x4位图拉伸到更大的空间,但效果很好。我的猜测是你没有响应WM_PAINT / WM_DRAWITEM和/或使用错误的DC。

编辑你的编辑:你是否从OnPaint或DrawItem调用中调用DrawImage?

我原本以为你最好不要缓存那个CDC并在每次想要绘制它时传递CDC。

答案 1 :(得分:0)

“来自位图指针* ImageData,分辨率为1392x1032”

不,不是, size 1392x1032。分辨率是每个距离的离散视觉单位数量。

无论如何,如上所述,您需要发布更多代码。至少显示OnPaint()。你在哪里实例化CPaintDC?创建一个新项目并将所有代码放在那里,以便您拥有一个展示问题的最小测试集。如果你使用StretchBlt()代替你现在使用的BitBlt(),你似乎大致走在正确的轨道上。