2013-01-23 34 views
2

我希望你們能幫助我解決這個問題。我不確定它是否是Java中的錯誤,或者我做錯了什麼,但是我會選擇後者。Java ImageWriter BufferedImage to GIF

我想將一個BufferedImage變成一個GIF圖像。然後我希望以字節數組的形式將GIF保存在內存中。 (我不想將文件保存到磁盤)

程序應該捕獲一個屏幕段(只是爲了創建一個快速圖像),並使用ImageIO ImageWriter和ByteArrayOutputStream將其轉換爲GIF字節數組。

下面的代碼會顯示錯誤。該程序將崩潰併發出ArrayIndexOutOfBoundsException,並且該數組保持爲空。如果你將「gif」替換爲「png」,它就可以正常工作,因此我很困惑。也!如果我將圖像保存到磁盤上的文件中

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]); 
    } 
+0

哇,這很奇怪... – leonbloy

+0

爲了更好地幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

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(); 
1

u必須使用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 

希望這有助於!