2

我希望你们能帮助我解决这个问题。我不确定这是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]);
    }
4

2 回答 2

4

似乎在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();
于 2013-01-23T21:08:13.250 回答
1

你必须使用 aByteArrayOutputStream来获取图像作为字节。要写这个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

希望这可以帮助!

于 2016-02-21T04:34:32.307 回答