gpt4 book ai didi

gdi - 如何在GDI编程中创建一个大的兼容内存DC?

转载 作者:行者123 更新时间:2023-12-02 12:14:40 27 4
gpt4 key购买 nike

我想创建一个大的CompatibleDC,在上面绘制一个大图像,然后将图像的一部分bitblt到其他DC,以达到高性能。

我正在使用以下代码来创建兼容的内存 DC。但是当矩形变得非常大时,例如:5000*5000,创建的 CompatibleDC 变得不稳定。有时可以,有时失败。我的代码有什么问题吗?

input :pInputDC
output:pOutputMemDC

{
pOutputMemDC=new CDC();
VERIFY(pOutputMemDC->CreateCompatibleDC(pInputDC));

CRect rect(0,0,nDCWidth,nDCHeight);
CBitmap bitmap;
if (bitmap.CreateCompatibleBitmap(pInputDC, rect.Width(), rect.Height()))
{
pOutputMemDC->SetViewportOrg(-rect.left, -rect.top);
m_pOldBitmap = pOutputMemDC->SelectObject(&bitmap);
}
CBrush brush;
VERIFY(brush.CreateSolidBrush(RGB(255,0, 0)));
brush.UnrealizeObject();
pOutputMemDC->FillRect(rect, &brush);
}

最佳答案

不要创建一个大的 DC,然后将其一部分传输到另一个较小的 DC,而是创建一个与目标 DC 大小相同的 DC,或者至少与位 block 传输目标大小相同的 DC。然后,将所有绘图命令偏移要复制的子部分的 (-x,-y)。如果您的目标是源上的 (100,200)-(400,400),则创建一个 DC (300x200) 并将所有内容偏移 (-100,-200)。

这有两大优点:首先,所需的内存要小得多。其次,GDI 会将您的绘图操作裁剪为 DC 的大小(无论如何它总是会裁剪)。尽管剪切操作需要 CPU 时间,但不绘制看不到的像素所节省的时间足以弥补这一不足。

现在,如果这个大型 DC 类似于图像(例如 JPEG),那么您需要研究其他方法。许多图像编辑程序使用的一种技术是将图像分割成图 block 并将图 block 分页到内存/硬盘或从内存/硬盘分页。每个图 block 都有自己的 DC,并且您只有足够的源 DC 来填充目标 DC。当 View 窗口在大图像上移动时,卸载已移出目标矩形的图 block 并加载已变得可见的图 block 。

关于gdi - 如何在GDI编程中创建一个大的兼容内存DC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/881270/

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