1

谢谢大家的解答,其实我并不疑惑draw 1024*768像素比100*100像素慢...就是这么简单的一个逻辑..让我不解的是DrawImage的插值算法可能很慢,虽然存在很多更好的算法,它的解码器似乎可以从具有一定分辨率的 jpg 解码,这真的很酷,我搜索了一段时间但没有找到任何免费的库来做到这一点......

真的很奇怪!我在 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);

上面的速度真的很快!甚至是实时的!我认为解码 5m 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 的过程真的很慢……

他们为什么以及如何做到这一点?微软给负责解码的人支付的工资是负责编写绘图图像的人的两倍吗?

4

4 回答 4

5

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

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

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

正确的?

好吧,在第二种情况下您绘制的像素多 100 倍这一事实可能与此有关。

于 2008-11-07T07:41:27.857 回答
2

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

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

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

也许Reflector会告诉你?

于 2008-11-07T07:45:22.043 回答
2

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

于 2008-11-07T10:23:36.610 回答
0

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

通常,做一些分析或时间测量。如果 2000x2000 比 200x200 慢大约 100 倍,那么一切正常。如果 2000x2000 太慢,请不要打扰。如果你的屏幕是 1024x768,你看不到整个图像,所以你最好选择屏幕上可见的图像部分进行绘制,1024x768 比 2000x2000 快 5 倍。

于 2008-11-07T09:58:43.320 回答