在java中存储图像的最有效方法

时间:2014-10-17 19:47:36

标签: java image image-processing 2d

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

提前感谢每一条回复/评论!

1 个答案:

答案 0 :(得分:1)

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

BufferedImage正在延长Image。因此,主要选择是在BufferedImage和原始int[]数组之间。

关于BufferedImageint[]数组的内存开销:对于"相当大的"这应该是可以忽略的。图像,因为BufferedImage(带TYPE_INT_*)与内部实际数据的int[]数组相比存储的内容不多。 (特别是,此int[]数组存储为DataBufferIntRaster的数据。

关于性能,访问原始数组元素和访问BufferedImage的像素之间可能存在显着甚至显着的差异。 BufferedImage很快,特别是对于绘图,但是当涉及到像素值的计算时,没有什么能比原始的int[]数组更好。

然而,这对可能影响最终决定的广泛问题只有一点看法。例如,当您说要执行边缘检测等操作时,您可能会注意到BufferedImage已经可以使用此功能,如Java2D Imaging Tech Notes的Image Processing and Enhancement部分所示。您无法通过使用带有仅4(4)行代码的普通int[]阵列上的sobel滤波器进行卷积来实现边缘检测。

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

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