【问题标题】:GDI+ 's Amazing decode speed, and terrible draw speed!GDI+ 惊人的解码速度和可怕的绘制速度!
【发布时间】:2008-11-07 07:15:33
【问题描述】:

感谢解答,其实我并不疑惑draw 1024*768 pixel比100* 100 pixel要慢...就是这么简单的一个逻辑.. 让我不解的是,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);

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

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

【问题讨论】:

    标签: gdi+ drawing decoder


    【解决方案1】:

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

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

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

    正确吗?

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

    【讨论】:

    • 我对绘制 40000 像素比 4000000pixles 更快并不感到困惑。并且由于插值计算,绘图 image->width* image->height 比 image->width/2 * image->hight/2 更快也不让我感到困惑。不管怎样,谢谢你的回答
    【解决方案2】:

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

    【讨论】:

    • 有什么方便的库来做这个吗?
    【解决方案3】:

    解码可能会延迟到需要时。这就是它如此之快的原因。

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

    图形例程总是包含一些晦涩难懂的优化,你永远不会知道。

    也许Reflector 会告诉你?

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-04-07
        • 2016-05-03
        • 1970-01-01
        • 2011-07-19
        • 1970-01-01
        • 2015-10-08
        • 1970-01-01
        • 2014-05-28
        相关资源
        最近更新 更多