嗨,亲爱的大师和专业编码员。
我不会从新手入手,对图像编程也不了解,但不幸的是,这些都是事实:(
我正在尝试从位图指针* ImageData显示分辨率的图像
1392x1032。我试图将其绘制在分辨率或大小为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在 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位图扩展到更大的空间,但是效果很好。我的猜测是您不是为了响应WM_PAINT / WM_DRAWITEM和/或使用了错误的DC而这样做。
编辑后再编辑:然后从OnPaint或DrawItem调用中调用DrawImage吗?
我本以为您最好不要缓存该CDC,并在每次希望绘制它时都传递CDC。
关于c++ - 无法显示比CDC区域更高分辨率的位图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2833039/