感谢您的回答,实际上我并不感到困惑,因为1024 * 768像素的绘制速度比100 * 100像素慢...这是一个如此简单的逻辑... 让我感到困惑的是,DrawImage的插值算法可能会非常慢,而且存在许多更好的算法,并且它的解码器似乎可以从具有一定分辨率的jpg解码,它真的很酷,我搜索了一段时间但没有找到任何免费lib来做这个...

真奇怪! 我在Paint方法中添加以下代码。 c:\ 1.jpg是5M jpg文件,大约4000 * 3000

// --------------------------------------------- -----------------

HDC hdc = pDC->GetSafeHdc();
bitmap = Bitmap::FromFile(L"c:\\1.jpg",true);
Graphics graphics(hdc);
graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
graphics.DrawImage(bitmap,0,0,200,200);

以上真的很快!甚至是实时!我认为解码一个5米的JPG不会那么快!

// --------------------------------------------- -----------------

HDC hdc = pDC->GetSafeHdc();
bitmap = Bitmap::FromFile(L"c:\\1.jpg",true);
Graphics graphics(hdc);
graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
graphics.DrawImage(bitmap,0,0,2000,2000);

上面的代码变得很慢

// --------------------------------------------- -----------------

如果我添加Bitmap = Bitmap :: FromFile(L" c:\ 1.jpg",true); //进入构造

离开

    Graphics graphics(hdc);
    graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
    graphics.DrawImage(bitmap,0,0,2000,2000);

在OnPaint方法中, 代码仍然有点慢~~~

// --------------------------------------------- ---------------------

与解码相比,drawImage Process非常慢......

为什么以及他们是如何做到的?微软是否支付了负责解码器双倍工资的男性,而不是负责编写drawingImage的男性?

有帮助吗?

解决方案

如果缩小8倍,则无需解码JPG.JPG图像由8 x 8像素的块组成,经DCT转换。该块的平均值是DCT的0,0系数。因此,缩小8倍仅仅是抛弃所有其他组件的问题。进一步向下缩放(例如4000-> 200)只需要从4000缩小到500,然后通常从500像素缩放到200像素。

其他提示

所以,你真正想知道的是为什么

graphics.DrawImage(bitmap,0,0,200,200);

graphics.DrawImage(bitmap,0,0,2000,2000);

正确?

嗯,你在第二种情况下绘制100倍像素的事实可能与它有关。

有可能延迟解码直到需要。这就是为什么它如此之快。

也许在200x200的情况下,GDI +只能解码足够的块来绘制200x200,而在2000x2000上它们会解码得更多。

图形例程总是包含一些模糊的优化,你永远不会知道。

也许反射器会告诉你?

只是一个猜测,但你可以尝试用4000x3000或2000x1500绘图吗?也许4000和3000可被200整除的事实正在加快整体速度,而不能被200整除的3000减速它(虽然这真的很奇怪)。

通常,进行一些分析或时间测量。如果2000x2000比200x200慢大约100倍,一切都还可以。如果2000x2000太慢,请不要打扰。如果您的屏幕是1024x768,则无法看到整个图像,因此您最好选择屏幕上可见的图像部分并进行绘制,1024x768比2000x2000快5倍。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top