gpt4 book ai didi

Java:在 BufferedImages 中分割 .GIF 图像会产生格式错误的图像

转载 作者:行者123 更新时间:2023-12-02 10:19:30 32 4
gpt4 key购买 nike

所以我有一小段代码,它接受 .gif 图像作为输入,然后将此 .gif 图像拆分为 BufferedImage 数组。之后,它将图像存储在磁盘上的数组中。当我执行此操作时,输出图像包含大量白色像素噪声,这在输入 .gif 图像中不可见。

输入 gif 示例:

Input gif

格式错误的输出图像示例(gif 中的第三帧):

Malformed image

我用来分割gif的代码如下:

public static void main(String[] args) throws Exception {
splitGif(new File("C:\\test.gif"));
}

public static void splitGif(File file) throws IOException {
ImageReader reader = ImageIO.getImageReadersBySuffix("gif").next(); reader.setInput(ImageIO.createImageInputStream(new FileInputStream(file)), false);
for(int i = 0; i < reader.getNumImages(true); i++) {
BufferedImage image = reader.read(i);
ImageIO.write(image, "PNG", new File(i + ".png"));
}
}

谁能帮帮我吗?

最佳答案

所以问题是,当将 .gif 文件读入 java 时,给定帧中与前一帧相比没有改变颜色的所有像素将是完全透明的。如果您想读取 .gif 并将其拆分为正确渲染的 BufferedImage 数组,则必须使用前一帧的最后一个非透明像素填充当前帧的透明像素。

代码:

public static void splitGif(File file) throws IOException {
ImageReader reader = ImageIO.getImageReadersBySuffix("gif").next();
reader.setInput(ImageIO.createImageInputStream(new FileInputStream(file)), false);
BufferedImage lastImage = reader.read(0);
ImageIO.write(lastImage, "PNG", new File(0 + ".png"));

for (int i = 1; i < reader.getNumImages(true); i++) {
BufferedImage image = makeImageForIndex(reader, i, lastImage);
ImageIO.write(image, "PNG", new File(i + ".png"));
}
}

private static BufferedImage makeImageForIndex(ImageReader reader, int index, BufferedImage lastImage) throws IOException {
BufferedImage image = reader.read(index);
BufferedImage newImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);

if(lastImage != null) {
newImage.getGraphics().drawImage(lastImage, 0, 0, null);
}
newImage.getGraphics().drawImage(image, 0, 0, null);

return newImage;
}

关于Java:在 BufferedImages 中分割 .GIF 图像会产生格式错误的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54443002/

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