Why does ImageReader return incorrect BufferedImage?

前端 未结 2 1962
星月不相逢
星月不相逢 2020-12-11 18:23

I\'m trying to access a animated GIF image with 21 frames and then read the 12th (cause it starts at 0?) frame.

import java.awt.image.BufferedImage;
import j         


        
2条回答
  •  轮回少年
    2020-12-11 19:05

    The rectangle in your example appears to be a frame representing the changed portion of the image sequence, starting from 1. Open the file in Gimp to see.

    enter image description here

    Addendum: It looks like a feature intended to optimize rendering. At a guess, I'd say you could rely on the bounds of image number getMinIndex(); later frames appear to be subsumed in the first.

    Addendum:

    is there a way to get the full pixel data with the normal image and changes?

    Assuming known geometry, you should be able to combine the first image and any later one in a BufferedImage, as shown here.

    Code:

    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.net.URL;
    import javax.imageio.ImageIO;
    import javax.imageio.ImageReader;
    
    public class GifBounds {
    
        /** @see https://stackoverflow.com/questions/5688104 */
        public static void main(String[] args) throws IOException {
            search(new URL("http://i55.tinypic.com/263veb9.gif"));
        }
        public static void search(URL url) throws IOException {
            try {
                ImageReader reader = ImageIO.getImageReadersBySuffix("gif").next();
                reader.setInput(ImageIO.createImageInputStream(url.openStream()));
                int i = reader.getMinIndex();
                while (true) {
                    BufferedImage bi = reader.read(i++);
                    System.out.println(i
                        + ": " + bi.getWidth()
                        + ", " + bi.getHeight());
                }
    
            } catch (IndexOutOfBoundsException e) {
                // ignored
            }
        }
    }
    

    Console:

    1: 200, 220
    2: 79, 95
    3: 77, 94
    4: 78, 95
    5: 79, 95
    6: 77, 94
    7: 78, 95
    8: 79, 95
    9: 77, 94
    10: 180, 205
    11: 97, 111
    12: 173, 200
    13: 174, 155
    14: 174, 155
    15: 174, 155
    16: 174, 155
    17: 174, 155
    18: 174, 155
    19: 174, 155
    20: 167, 200
    21: 97, 111
    

提交回复
热议问题