gpt4 book ai didi

java - 为什么 ImageReader 返回不正确的 BufferedImage?

转载 作者:搜寻专家 更新时间:2023-10-31 20:06:24 26 4
gpt4 key购买 nike

我正在尝试访问具有 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 中打开文件以查看。

enter image description here

附录:它看起来像一个 feature旨在优化渲染。猜测一下,我会说你可以依赖图像编号的边界 getMinIndex();后面的帧似乎包含在第一个中。

附录:

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

假设几何已知,您应该能够将第一个图像和任何后面的图像合并到一个 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, 2202: 79, 953: 77, 944: 78, 955: 79, 956: 77, 947: 78, 958: 79, 959: 77, 9410: 180, 20511: 97, 11112: 173, 20013: 174, 15514: 174, 15515: 174, 15516: 174, 15517: 174, 15518: 174, 15519: 174, 15520: 167, 20021: 97, 111

关于java - 为什么 ImageReader 返回不正确的 BufferedImage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5688104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com