C++ Can';t显示比CDC区域分辨率更高的位图
嗨,亲爱的古鲁和专业的程序员们 我不会从一个新手开始,对图像编程不太了解,但不幸的是,事实是:( 我试图显示一个位图指针*图像数据的分辨率图像 我试着在一个分辨率或大小为627x474的区域上绘制它 但是,重复尝试似乎不起作用。当我将创建的位图图像从*ImageData width and height更改为分辨率或大约627x474的大小时,它就起作用了 在尝试了各种论坛和谷歌的所有可能解决方案后,我真的不知道如何解决这个问题 pDC是CDC*,memDC是在早期方法中初始化的CDC 此处未初始化的任何内容都是在其他方法中初始化的 这是我的密码,亲爱的谦卑的古鲁。请给我提供尤达和欧比万给卢克·天行者的指导C++ Can';t显示比CDC区域分辨率更高的位图,c++,mfc,cdc,cbitmap,C++,Mfc,Cdc,Cbitmap,嗨,亲爱的古鲁和专业的程序员们 我不会从一个新手开始,对图像编程不太了解,但不幸的是,事实是:( 我试图显示一个位图指针*图像数据的分辨率图像 我试着在一个分辨率或大小为627x474的区域上绘制它 但是,重复尝试似乎不起作用。当我将创建的位图图像从*ImageData width and height更改为分辨率或大约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类) (b) 在DemoControl类中
m_Demo = new DemoControl ;
m_Demo->Initialisation( this, this->GetDC() ) ;
bool DemoControl::初始化(CDemoTestingDlg m_FormControl,CDC m_StaticDisplay){
}
pDC和memDC在标题中也是如此:
CDC* pDC ; CDC memDC;
(c) 如果假设捕获了图像,则图像指针将传递给DemoTestingDlg类,该类随后将调用Demo控件类中的showImage方法,这是我在问题中编写的方法。我这样做对吗
注意:如果它们的大小相同(我指的是CDC和位图),它确实会显示一个图像,因此我的印象是我的CDC指针传递正确是您的朋友:)
编辑:好的,你如何得到pDC?什么时候调用函数?在油漆上还是图纸上
这是一个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。“从位图指针*分辨率为1392x1032的图像数据”
不,不是,它的尺寸是1392x1032。分辨率是每距离离散视觉单位的数量
正如上面提到的,您需要发布更多的代码。至少显示OnPaint()。您在哪里实例化CPaintDC?创建一个新项目并将所有代码放在其中,这样您就有了一个显示问题的最小测试集。如果您使用StretchBlt()代替当前使用的BitBlt(),您似乎大致上走在了正确的轨道上。也尝试了StretchBlt,但不幸的是效果相同:(或者我误解了你的问题,或者你对StretchBlt做了一些错误。StretchBlt将把1392x1032图像渲染成627x424 DC…你得到了什么错误?我可以看到你尝试过的StretchBlt调用吗?pDC->StretchBlt(22,24627474,&memDC,0,0,宽度,高度,SRCCOPY);它不显示错误。与bitblt一样,当我将图像的宽度和高度设置为“宽度”和“高度”时,两者都没有返回图像(请参阅上面的值)。只有当我将宽度和高度设置为与CDC区域相同(627x474)时,图像才会显示。抱歉,我应该说没有显示错误。感谢GozI的回复。我认为我应该解释流程如何。1.一个类(比如DemoTestingDlg类)会将CDC如下传递给另一个类(比如DemoControl类)m_Demo=new DemoControl;m_Demo->initialization(this,this->GetDC());2.在DemoControl类bool DemoControl::initialization(CDemoTestingDlg m_FormControl,CDC m_StaticDisplay){pDC=m_StaticDisplay;memDC.CreateCompatibleDC(pDC);}pDC和memDC在头中是一样的:CDC*pDC;CDC memDC;
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 );