当我在JAVA中开发一些图像处理应用程序时,我想知道哪种方式最快,存储图像的内存消耗更少。到目前为止,我发现我可以通过将所有加载的数据存储在int []数组(宽度*高度长度,每个条目代表32位RGBA颜色),BufferedImage对象或Image对象中来实现。应用的主要目的是变换2D图像并执行特定结构(让我们说边缘,角落等)检测算法。
提前感谢每一条回复/评论!
答案 0 :(得分:1)
我把它作为评论开始,但它变得越来越长 - 也许它有资格作为答案。
BufferedImage
正在延长Image
。因此,主要选择是在BufferedImage
和原始int[]
数组之间。
关于BufferedImage
对int[]
数组的内存开销:对于"相当大的"这应该是可以忽略的。图像,因为BufferedImage
(带TYPE_INT_*
)与内部实际数据的int[]
数组相比存储的内容不多。 (特别是,此int[]
数组存储为DataBufferInt
中Raster
的数据。
关于性能,访问原始数组元素和访问BufferedImage
的像素之间可能存在显着甚至显着的差异。 BufferedImage
很快,特别是对于绘图,但是当涉及到像素值的计算时,没有什么能比原始的int[]
数组更好。
然而,这对可能影响最终决定的广泛问题只有一点看法。例如,当您说要执行边缘检测等操作时,您可能会注意到BufferedImage
已经可以使用此功能,如Java2D Imaging Tech Notes的Image Processing and Enhancement部分所示。您无法通过使用带有仅4(4)行代码的普通int[]
阵列上的sobel滤波器进行卷积来实现边缘检测。
还有一个answer on the GameDev stackexchange网站,其中涵盖了与此相关的一些方面,也许您会发现它很有趣。