为什么 ImageReader 返回不正确的 BufferedImage?
我正在尝试访问具有 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。 我在读取帧时所做的一切都正确吗?
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 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);
}
}
}
The reader should return me a buffered image with height 220 and width 200 (or height 205 and width 188 if it ignores white fields around the image).
But what it does is it returns me a image of height 155 and width 174 what is absurd because i triple checked and the frame 12 is height 220 and width 200.
Am I doing everything correctly in reading the frames?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
示例中的矩形似乎是表示图像序列已更改部分的框架,从 1 开始。在 Gimp 中打开文件进行查看。
附录:它看起来像 旨在优化渲染的功能。据猜测,我想说你可以依赖图像编号的范围
getMinIndex()
;后面的帧似乎包含在第一帧中。附录:
假设几何形状已知,您应该能够将第一个图像和后面的任何图像合并到
BufferedImage
中,如此处< /a>.代码:
控制台:
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.
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:
Assuming known geometry, you should be able to combine the first image and any later one in a
BufferedImage
, as shown here.Code:
Console:
代码 1
输出
代码 2
由trashgod 发布的代码的变体。
顺便说一句,我认为你应该将垃圾神的答案标记为正确的两个答案。
首先要触及问题的真正核心。你一定会喜欢带有屏幕截图的答案。这就是“整个 9 码”。
Code 1
Output
Code 2
A variant of the code posted by trashgod.
As an aside, I think you should mark trashgod's answer correct of the two answers.
It was first to get to the real core of the problem. And you gotta' love an answer with screen-shots. That's going 'the whole 9 yards'.