gpt4 book ai didi

Java ImageWriter 缓冲图像转 GIF

转载 作者:行者123 更新时间:2023-11-30 06:26:18 31 4
gpt4 key购买 nike

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

最佳答案

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

关于Java ImageWriter 缓冲图像转 GIF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14488452/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com