从文件读取/写入图像到BufferedImage的最快方法?

时间:2013-08-29 23:11:27

标签: java grails grails-2.0 javax.imageio

  1. 使用Java / Grails将文件中的图像读取到BufferedImage的最快方法是什么?
  2. 将图像从BufferedImage写入Java / Grails文件的最快方法是什么?
  3. 我的变体(阅读):

    byte [] imageByteArray = new File(basePath+imageSource).readBytes()
    InputStream inStream = new ByteArrayInputStream(imageByteArray)
    BufferedImage bufferedImage = ImageIO.read(inStream)
    

    我的变体(写):

    BufferedImage bufferedImage = // some image
    def fullPath = // image page + file name
    byte [] currentImage
    
    try{
    
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write( bufferedImage, "jpg", baos );
        baos.flush();
        currentImage = baos.toByteArray();
        baos.close();
    
        }catch(IOException e){
            System.out.println(e.getMessage());
        }       
       }    
    
    
    def newFile = new FileOutputStream(fullPath)
    newFile.write(currentImage)
    newFile.close()
    

3 个答案:

答案 0 :(得分:8)

您的阅读解决方案基本上是两次读取字节,一次是从文件读取,一次是从ByteArrayInputStream读取。不要那样做

使用Java 7阅读

BufferedImage bufferedImage = ImageIO.read(Files.newInputStream(Paths.get(basePath + imageSource)));

用Java 7编写

ImageIO.write(bufferedImage, "jpg", Files.newOutputStream(Paths.get(fullPath)));

Files.newInputStream的调用将返回ChannelInputStream,其中(AFAIK)未缓冲。你想要包装它

new BufferedInputStream(Files.newInputStream(...));

因此,对磁盘的IO调用较少,具体取决于您的使用方式。

答案 1 :(得分:5)

我来晚了,但无论如何......

实际上,使用:

ImageIO.read(new File(basePath + imageSource));

ImageIO.write(bufferedImage, "jpeg", new File(fullPath));

...可能会更快(尝试使用分析器确保)。

这是因为这些变体在幕后使用RandomAccessFile支持的ImageInputStream / ImageOutputStream实现,而基于InputStream / OutputStream的版本将通过default使用磁盘支持的可搜索流实现。磁盘备份涉及将流的全部内容写入临时文件并可能从中读回(这是因为图像I / O通常受益于非线性数据访问)。

如果要避免使用基于流的版本的额外I / O,以使用更多内存为代价,可以调用名称不明确的ImageIO.setUseCache(false)来禁用磁盘缓存可搜索的输入流。如果你处理非常大的图像,这显然不是一个好主意。

答案 2 :(得分:0)

你写作几乎不错。只是不要使用中间ByteArrayOutputStream。这是代码中的一个巨大瓶颈。而是将FileOutputStream包装在BufferedOutputStream中并执行相同的操作。

你的阅读也是如此。删除Itermediate ByteArrayInputStream。