2

嗨,亲爱的专家和编码专家。

我不会从一个新手开始,我对图像编程不太了解,但不幸的是这些都是事实:(

我正在尝试从分辨率为 1392x1032 的位图指针 *ImageData 显示图像。我试图在分辨率或大小为 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 类,该类随后将调用演示控件类中的 showImage 方法,这是我在问题中编写的方法。我做对了吗?

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

4

2 回答 2

1

StretchBlt是你的朋友 :)

编辑:好的,你如何获得 pDC?什么时候调用你的函数?表单 OnPaint 还是 DrawItem?

这是我从覆盖的 CStatic 中的 DrawItem 调用中执行的 StretchBlt。

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。

于 2010-05-14T09:29:43.547 回答
0

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

不,不是,它的大小为1392x1032。分辨率是每距离的离散视觉单位的数量。

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

于 2010-05-14T15:52:57.290 回答