我正在尝试访问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。
我在阅读镜架时是否做得正确?
最佳答案
您的示例中的矩形似乎是一个框架,代表图像序列的更改部分,从1开始。在Gimp中打开文件以查看。
附录:看起来像feature,旨在优化渲染。猜测一下,我想您可以依靠图像编号getMinIndex()
的范围;以后的帧似乎包含在第一个帧中。
附录:
有没有办法获取正常图像和变化的完整像素数据?
假定几何形状已知,您应该能够在BufferedImage
中组合第一个图像和任何后续图像,如here所示。
码:
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