gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:47 25 4
gpt4 key购买 nike

大家好,亲爱的专家和编码专家。

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

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

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

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

pDC 是 CDC* 而 memDC 是在早期方法中初始化的 CDC此处未初始化的所有内容均已在其他方法中初始化。

亲爱的谦虚大师,这是我的代码。请向我提供 Yoda 和 Obi-Wan 为 Luke Skywalker 提供的指导。

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 在 header 中是这样的:

CDC* pDC ; CDC memDC; 

(c) 如果假设捕获了图像,图像指针将传递给 DemoTestingDlg 类,该类随后将调用 Demo Control 类中的 showImage 方法,这是我在问题中编写的方法。我做对了吗?

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

最佳答案

StretchBlt是你的 friend :)

编辑:好的,你如何获得 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 位图拉伸(stretch)到更大的空间,但效果很好。我的猜测是您这样做不是为了响应 WM_PAINT/WM_DRAWITEM 和/或使用了错误的 DC。

重新编辑您的编辑:然后您是否从 OnPaint 或 DrawItem 调用中调用 DrawImage?

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

关于c++ - 无法显示比 CDC 区域更高分辨率的位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2833039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com