2

皆さんがこれで私を助けてくれることを願っています。それが Java のバグなのか、何か間違ったことをしているのかはわかりませんが、後者を使用します。

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

ByteArrayOutputStreamイメージをバイトとして取得するには、a を使用する必要があります。これに書き込むには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 に答える