【问题标题】:Java ImageWriter BufferedImage to GIFJava ImageWriter BufferedImage 转 GIF
【发布时间】:2013-01-07 10:45:13
【问题描述】:

我希望你们能帮助我解决这个问题。我不确定这是 Java 中的错误还是我做错了什么,但我会选择后者。

我想将 BufferedImage 转换为 GIF 图像。然后我希望将 GIF 以字节数组的形式保存在内存中。 (我不想将文件保存到磁盘)

程序应该捕获一个屏幕片段(只是为了创建一个快速图像)并使用 ImageIO ImageWriter 和 ByteArrayOutputStream 将其转换为 GIF 字节数组。

下面的代码将向您展示该错误。程序将崩溃并给出 ArrayIndexOutOfBoundsException 并且数组保持为空。如果你用“png”替换“gif”,它会工作得很好,因此我很困惑。还!如果我将图像保存到磁盘上的文件中

write.setOutput(ImageIO.createImageOutputStream(new FileOutputStream(new File("C:/Image.gif")));

它会正确地将其保存为 .gif 文件。

所以我的问题是,我在这段代码中做错了什么?任何帮助将不胜感激! :)

注意:这不是动画 GIF,也不涉及透明度。

    String format = "gif";
    Robot r = null;
    try {
        r = new Robot();
    } catch (AWTException e1) {
        e1.printStackTrace();
    }
    BufferedImage screen = r.createScreenCapture(new Rectangle(512,512));
    final BufferedImage gif = new BufferedImage(512,512,BufferedImage.TYPE_BYTE_INDEXED);
    Graphics2D g = gif.createGraphics();
    g.drawImage(screen,0,0,null);
    g.dispose();
    ImageWriter write = ImageIO.getImageWritersBySuffix(format).next();
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    try {
        write.setOutput(ImageIO.createImageOutputStream(out));
        write.write(gif);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    for(int i=0; i < 10; i++) {
        System.out.println(out.toByteArray()[i]);
    }

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE

标签: java gif bufferedimage javax.imageio bytearrayoutputstream


【解决方案1】:

com.sun.imageio.plugins.gif.* 中似乎有一些奇怪的(如果不是明显的错误)流缓冲实现。如果您没有显式刷新或关闭 ImageOutputStream,则内容不会被刷新,即使在关闭基础流之后。改变

 write.setOutput(ImageIO.createImageOutputStream(out));
 write.write(gif);

   ImageOutputStream imageos = ImageIO.createImageOutputStream(out);
   write.setOutput(imageos);
   write.write(gif);
   imageos.close();  // or imageos.flush();

【讨论】:

    【解决方案2】:

    你必须使用ByteArrayOutputStream 来获取图像作为字节。要写信给这个ByteArrayOutputStream,你应该用ImageOutputStream 包裹它。

    ImageWriter jpgWriter = ImageIO.getImageWritersByFormatName("gif").next();
    //got imagewriter for gif
    ImageWriteParam gifWriteParam = jpgWriter.getDefaultWriteParam();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageOutputStream ios=ImageIO.createImageOutputStream(baos);
    jpgWriter.setOutput(ios);
    jpgWriter.write(null,new IIOImage(myBufferedImageObject, null, null),gifWriteParam);
    baos.flush();
    byte[] buf= baos.toByteArray();//got as bytes here
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2011-05-12
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 2012-11-16
      • 2013-03-07
      • 2012-02-14
      • 1970-01-01
      相关资源
      最近更新 更多