GDI +的惊人的解码速度和糟糕的绘制速度!

时间:2008-11-07 07:15:33

标签: gdi+ drawing decoder


感谢您的回答,其实我并不感到困惑的是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的男性?

4 个答案:

答案 0 :(得分:5)

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

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

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

正确?

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

答案 1 :(得分:2)

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

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

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

也许Reflector会告诉你?

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

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