6

我正在尝试访问具有 21 帧的动画 GIF 图像,然后读取第 12 帧(因为它从 0 开始?)帧。

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.filefilter.SuffixFileFilter;
import org.apache.commons.io.filefilter.TrueFileFilter;

public class PictureSearch {

    public static void search(File file) {
        try {
            ImageReader reader = (ImageReader) ImageIO.getImageReadersBySuffix("gif").next();
            reader.setInput(ImageIO.createImageInputStream(file), false);
            BufferedImage caption = reader.read(12);

            System.out.println(caption.getHeight());
            System.out.println(caption.getWidth());

            caption.flush();

        } catch (IOException e) {
            System.out.println(e);
        }
    }

    public static void main(String[] args) throws IOException {
        List<String> suffixes = new ArrayList<String>();
        suffixes.add(".jpg");
        suffixes.add(".gif");
        suffixes.add(".bmp");
        suffixes.add(".png");

        Iterator<File> files = FileUtils.iterateFiles(new File(
                "F:/test/"), (IOFileFilter) new SuffixFileFilter(
                suffixes), TrueFileFilter.INSTANCE);

        while (files.hasNext()) {
            File file = (File) files.next();
            PictureSearch.search(file);
        }

    }
}

读者应该返回一个高度为 220 和宽度为 200 的缓冲图像(如果忽略图像周围的白色字段,则为高度 205 和宽度 188)。但它的作用是返回给我一个高度为 155 和宽度为 174 的图像,这是荒谬的,因为我进行了三次检查,并且框架 12 的高度为 220 和宽度为 200。我在阅读框架时做的一切正确吗?

4

2 回答 2

4

您的示例中的矩形似乎是一个表示图像序列更改部分的框架,从 1 开始。在 Gimp 中打开文件以查看。

在此处输入图像描述

附录:它看起来像是一个旨在优化渲染的功能。猜测一下,我会说你可以依靠 image number 的界限getMinIndex();后面的帧似乎包含在第一个帧中。

附录:

有没有办法用正常的图像和变化来获取完整的像素数据?

假设已知几何图形,您应该能够将第一张图像和任何后面的图像组合在 a中,如此BufferedImage所示。

代码:

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
        }
    }
}

安慰:

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
于 2011-04-16T18:27:48.700 回答
1

代码 1

import java.net.URL;
import java.awt.Image;
import javax.imageio.ImageIO;

class GetGifSize {

    public static void main(String[] args) throws Exception {
        URL urlToImage = new URL("http://i55.tinypic.com/263veb9.gif");
        Image image = ImageIO.read(urlToImage);
        System.out.println( "Image size is " +
            image.getWidth(null) +
            "x" +
            image.getHeight(null) );
    }
}

输出

Image size is 200x220

代码 2

垃圾神发布的代码的变体。

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 http://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 {
        ImageReader reader = ImageIO.getImageReadersBySuffix("gif").next();
        reader.setInput(ImageIO.createImageInputStream(url.openStream()));
        int i = reader.getMinIndex();
        int offset = i-0;
        int count = reader.getNumImages(true);
        System.out.println("Image count: " + count);
        for (int ii=i; ii<(count-i); ii++) {
            BufferedImage bi = reader.read(ii);
            System.out.println(ii
                + offset
                + ": " + bi.getWidth()
                + ", " + bi.getHeight());
        }
    }
}

顺便说一句,我认为您应该在两个答案中将垃圾神的答案标记为正确。

它首先触及问题的真正核心。你必须'喜欢屏幕截图的答案。这就是“整个 9 码”。

于 2011-04-16T18:07:54.037 回答