繁体   English   中英

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

[英]Can't Display Bitmap of Higher Resolution than CDC area

嗨,亲爱的大师和专业编码员。

我不会从新手入手,对图像编程也不了解很多,但是不幸的是,这些是事实:(

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

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

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

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类中调用showImage方法,该方法是我在问题中编写的方法。 我做对了吗?

注意:如果确实说它们具有相同的大小(确实是CDC和位图),那么它确实显示了图像,因此我的印象是CDC指针正确传递了

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。

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

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

无论如何,如上所述,您需要发布更多代码。 至少显示OnPaint()。 您在哪里实例化CPaintDC? 新建一个项目,然后将所有代码放入其中,以便使用最小的测试集来展示问题。 如果您使用StretchBlt()代替现在使用的BitBlt(),则您似乎处于正确的轨道。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM