【问题标题】:Most efficient method of storing image in java在java中存储图像的最有效方法
【发布时间】:2014-12-13 11:23:00
【问题描述】:

当我正在用 JAVA 开发一些图像处理应用程序时,我想知道哪种方式存储图像最快且占用内存更少。到目前为止,我发现我可以通过将所有加载的数据存储在 int[] 数组(宽度*高度长度,每个条目代表 32 位 RGBA 颜色)、BufferedImage 对象或 Image 对象中来做到这一点。应用的主要目的是对 2D 图像进行变换并执行特定结构(比如边缘、角落等)检测算法。

提前感谢您的每一个回复/评论!

【问题讨论】:

  • 看看this的问题。
  • 但是我也对耗时方面(即读取单个像素信息)和处理它感到好奇。

标签: java image image-processing 2d


【解决方案1】:

我以评论开头,但它变得越来越长 - 也许它有资格作为答案。

BufferedImage 正在扩展 Image。所以主要的选择是在BufferedImage 和原始int[] 数组之间。

关于BufferedImage 相对于int[] 数组的内存开销:对于“相当大”的图像,这应该可以忽略不计,因为BufferedImage(带有TYPE_INT_*)存储的内容远不及@987654331 @array 内部包含实际数据。 (特别是,这个int[] 数组作为DataBufferInt 的数据存储在Raster 中)。

关于性能,访问原始数组元素和访问BufferedImage 的像素之间可能存在明显甚至显着的差异。 BufferedImages 速度很快,尤其是对于绘图而言,但在计算像素值时,没有什么能比得上简单的原始 int[] 数组了。

但是,这对可能影响最终决定的广泛问题只提供了很少的启示。例如,当你说你想做边缘检测之类的事情时,你可能会注意到这个功能已经可用于BufferedImage,如 Java2D Imaging 技术说明的Image Processing and Enhancement 部分所示。 只有 4(四)行代码,您将无法通过在普通 int[] 数组上使用 sobel 滤波器进行卷积来实现边缘检测。

顺便说一句:技术说明一般都提供了一些背景信息,绝对值得一看,以便在这里做出深刻的决定。

还有一个answer on the GameDev stackexchange 网站,涵盖了与此处相关的一些方面,也许您会觉得它很有趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2012-10-29
    • 2011-06-22
    相关资源
    最近更新 更多