gpt4 book ai didi

java - 将PNG图像快速加载到java中的数组中

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:43:20 24 4
gpt4 key购买 nike

我想加载(和解码)PNG 图像并将它们转换为 Java 中的一维数组。我显然可以使用 ImageIO.read() 执行此操作,然后将像素复制到数组中,但这会消耗两倍的内存(光栅 + 最终数组)并且涉及的处理时间比我想要的要多。

我该怎么办?最坏的情况我可以自己实现 PNG 规范,但这似乎是一项相当复杂的任务。理想情况下,我想要一个可以“插入”的 PNG 实现。不太理想但仍然很好的是一个易于理解(不像 com.sun 代码)我可以(并且将被允许)修改的 PNG 阅读器。

最佳答案

如果您要做的是将像素数据作为数组获取,那么您可以使用 ImageIO.read() 获取 BufferedImage 然后使用BufferedImage.getRaster().getDataBuffer() 获取 DataBuffer。从那里,您需要检查您拥有的 BufferedImage 类型,以确定如何转换 DataBuffer。例如。如果你有一个 TYPE_INT_RGB 图像,那么你应该转换为一个 DataBufferInt 然后你可以调用 DataBufferInt.getData() 来检索 int[] 包含数据。您通过这种方式获得的不是副本——它是支持 BufferedImage 的实际数组。

但是,所有这些都有一个很大的警告:ImageIO.read() 通常不会给您想要的图像类型。例如,你会经常得到 TYPE_CUSTOM,除了复制到你真正想要的图像类型之外,你不能做任何有用的事情。

因此,如果您足够幸运ImageIO.read() 以您想要的格式为您提供图像。如果您想检查 ImageIO 有哪些可用类型,您可以调用 ImageIO.getImageReaders() 来获取所有读取器的 Iterator它声称能够读取您的流,然后您可以使用 ImageReader.getImageTypes(0) 获取读者可以读取的图像类型的 Iterator。您可能会找到一个阅读器,它会以这种方式为您提供您想要的图像类型,但不要屏住呼吸。

除非您的图像很大,否则复制它们实际上非常快。但是,如果您的图像 很大,您可能不得不诉诸于使用 BufferedImage.getRGB() 将原始图像数据一次一行写入磁盘(但是进行压缩,使用 GZIPOutputStream),让原始图像被垃圾收集,创建所需类型的新 BufferedImage,最后从磁盘读回行,写入使用 BufferedImage.setRGB() 将它们添加到新图像中。 (几天前我写了一些东西来做这件事,因此我对细节还内存犹新。它的 LGPL 来源是 here。)

关于java - 将PNG图像快速加载到java中的数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3913228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com