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でファイルを開いて確認してください。

ここに画像の説明を入力してください

補遺:レンダリングを最適化することを目的とした機能のようです。推測では、画像番号の範囲に頼ることができると思いますgetMinIndex()。後のフレームは最初のフレームに含まれているように見えます。

補遺:

通常の画像と変更で完全なピクセルデータを取得する方法はありますか?

既知のジオメトリを想定すると、ここ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

trashgodによって投稿されたコードの変種。

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

余談ですが、2つの答えのうちゴミ神の答えを正解とマークする必要があると思います。

問題の真の核心にたどり着いたのは最初でした。そして、あなたはスクリーンショットで答えを愛さなければなりません。それは「9ヤード全体」になります。

于 2011-04-16T18:07:54.037 に答える