Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:在BuffereImage中拆分.GIF图像会生成格式不正确的图像_Java_Image_Javax.imageio - Fatal编程技术网

Java:在BuffereImage中拆分.GIF图像会生成格式不正确的图像

Java:在BuffereImage中拆分.GIF图像会生成格式不正确的图像,java,image,javax.imageio,Java,Image,Javax.imageio,所以我有一段非常小的代码,它接受一个.gif图像作为输入,然后它将这个.gif图像分割成一个BuffereImage数组。之后,它将图像存储在磁盘上的阵列中。当我这样做时,输出图像包含在input.gif图像中看不到的严重白色像素噪声 输入gif的示例: 格式错误的输出图像示例(gif中的第三帧): 我用于拆分gif的代码如下所示: public static void main(String[] args) throws Exception { splitGif(new F

所以我有一段非常小的代码,它接受一个.gif图像作为输入,然后它将这个.gif图像分割成一个BuffereImage数组。之后,它将图像存储在磁盘上的阵列中。当我这样做时,输出图像包含在input.gif图像中看不到的严重白色像素噪声

输入gif的示例:

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

我用于拆分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"));
    }
}
publicstaticvoidmain(字符串[]args)引发异常{
splitGif(新文件(“C:\\test.gif”);
}
公共静态void splitGif(文件)引发IOException{
ImageReader reader=ImageIO.getImageReadersBySuffix(“gif”).next();reader.setInput(ImageIO.createImageInputStream(新文件输入流(文件)),false);
for(int i=0;i

有人能帮我吗?

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

代码:

publicstaticvoidsplitgif(文件)抛出IOException{
ImageReader=ImageIO.getImageReadersBySuffix(“gif”).next();
reader.setInput(ImageIO.createImageInputStream(新文件输入流(文件)),false);
BuffereImage lastImage=reader.read(0);
write(lastImage,“PNG”,新文件(0+“.PNG”);
for(inti=1;i
您自己解决了这个问题,但顺序很好:下一帧是所有先前帧的累积,填充当前帧中的透明像素

public static void splitGif(File file) throws IOException {
    ImageReader reader = ImageIO.getImageReadersBySuffix("gif").next();
    reader.setInput(ImageIO.createImageInputStream(new FileInputStream(file)), false);
    BufferedImage outImage = null;
    Graphics2D g = null;    
    for (int i = 0; i < reader.getNumImages(true); i++) {
         BufferedImage image = reader.read(i);
         if (g == null) {
             BufferedImage outImage = new BufferedImage(image.getWidth(), image.getHeight(),
                     BufferedImage.TYPE_4BYTE_ABGR);
             g = (Graphics2D) outImage.getGraphics();
         }
         g.drawImage(lastImage, 0, 0, null);
         ImageIO.write(outImage, "PNG", new File(i + ".png"));
     }
     if (g != null) {
         g.dispose();
     }
}
publicstaticvoidsplitgif(文件)抛出IOException{
ImageReader=ImageIO.getImageReadersBySuffix(“gif”).next();
reader.setInput(ImageIO.createImageInputStream(新文件输入流(文件)),false);
BuffereImage outImage=null;
图形2d g=null;
for(int i=0;i
  • getGraphics==createGraphics
    应该是一个
    dispose
    ,如文档所述

新文件(i+“.gif”)的作用是什么?Gif的透明度是什么。也许纯白需要转换成透明的RGBA。@JoopEggen我认为纯白没有问题,因为格式错误的图像中显示的像素应该是源gif中显示的深色。在颜色不变的情况下,第二代gif可以有透明像素。@JoopEggen我不太确定我是否知道你的意思。那么你是说,在我看不到任何颜色(或只是白色)的地方,颜色应该与它前面的框架相同吗?听起来很合乎逻辑;保留上一张图像,y/x为白色,设置RGB为上一张图像。或者最好将新帧绘制到image.getGraphics上作为gif
public static void splitGif(File file) throws IOException {
    ImageReader reader = ImageIO.getImageReadersBySuffix("gif").next();
    reader.setInput(ImageIO.createImageInputStream(new FileInputStream(file)), false);
    BufferedImage outImage = null;
    Graphics2D g = null;    
    for (int i = 0; i < reader.getNumImages(true); i++) {
         BufferedImage image = reader.read(i);
         if (g == null) {
             BufferedImage outImage = new BufferedImage(image.getWidth(), image.getHeight(),
                     BufferedImage.TYPE_4BYTE_ABGR);
             g = (Graphics2D) outImage.getGraphics();
         }
         g.drawImage(lastImage, 0, 0, null);
         ImageIO.write(outImage, "PNG", new File(i + ".png"));
     }
     if (g != null) {
         g.dispose();
     }
}