2010-06-04 45 views
4

我目前使用MFC/GDI和Stingray在我的应用程序中显示位图,并且正在寻找更好的解决方案。特别;任何用于显示大型位图的良好C++库

  • 更快的绘图速度 - 我现在的解决方案是缓慢的,基于的StretchDIBits
  • 更好的渲染质量 - 的StretchDIBits缩放位图旋转的位图
  • 支持时渲染质量是可怕的
  • 支持加载/保存在所有流行的格式
  • 支持大的位图 - 我经常使用的航空照片是〜64mb的12,000x12,000 jpegs。 GeoTIFF文件的支持也将是有益的
  • 与MFC文档/视图,包括打印兼容(如必须能够呈现到CDC)
  • 访问源代码,是好的,但没有必要
  • 易于使用/端口现有的GDI代码

虽然免费总是很好,但我不介意花费一个合理的金额在一个体面的图书馆,虽然没有运行时间的版税费用。谷歌搜索建议如下;

任何人得到的这些经验或能推荐一个很好的替代品?

+2

我看到您将JPEG的缩放比例超过了8倍。在这种情况下,您应该在JPEG级别完成缩放,而不是位图。这是*方式*更快。 JPEG使用傅立叶分量压缩8x8像素的块。显式存储的{0,0}组件是平均值。因此,将JPEG图像缩小8倍是血腥快速和相当平凡的。您会从12000 * 12000像素JPEG中获得1500 * 1500的位图,并且很可能您的磁盘速度将成为此处的限制因素。 – MSalters 2010-06-04 11:59:59

+0

@ MSalters,很好的评论,并且我使用的命令是StretchDIBits,我猜你说的是真的。更有理由采用不同的方法。 – 2010-06-04 13:48:04

回答

2

我认为你不可能在windows上发现比在GDI上执行更快的,因为它具有内核级支持,这是开源解决方案所不具备的。

您可能还想看看OpenGL或Direct2D/Direct3D,因为它们也可以直接访问帧缓冲区。使用3D API时,纹理大小可能会成为一个问题,因为大多数标准限制在4096x4096之类。

+0

我不相信速度的事情。如果我没有缩放位图,这可能是正确的,但StretchDIBits在缩放和绘制一个4000x4000像素位图(例如300x300像素框)时看起来并不快。它也会产生可怕的结果。关于StretchDIBits速度的以下讨论也很有趣http://www.gamedev.net/community/forums/topic.asp?topic_id=344785 – 2010-06-04 10:07:19

+0

移动整个过程OpenGL肯定值得考虑,尽管可能会涉及很多工作和在印刷方面造成问题。 – 2010-06-04 10:20:58

+0

StretchDIBits做一个简单的最近邻居缩放。对于某些应用程序而言,这正是您想要的,而不是别的。 (例如图像编辑器缩放) – shoosh 2010-06-04 18:26:33

2

我已经在过去使用过CxImage这是一个添加到您的评估列表。

+0

+1看起来不错,谢谢发布! – 2010-06-04 10:39:32

3

自早期XP以来,任何Windows机器上都可以使用GDI +。它具有所有流行图像格式的编解码器,包括JPEG。非常好的滤镜可以进行高质量的图像缩放。无限制的图像旋转。通过Graphics类绘制到CDC。 SDK gdiplusXxx.h头文件提供了C++包装的源代码。速度可能相当,但渲染是基于软件的,以确保兼容性。

您可以#include <gdiplus.h>并直接使用C++包装。 SDK文档are here。 CImage类在MFC中可用,但它不公开所有功能。

+0

+1这可能是一个很好的第一步,因为它应该是一个非常简单的端口。我一直有意从GDI换到GDI +一段时间,所以现在可能是时候咬紧牙关了。 – 2010-06-04 13:46:20