- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个程序,该程序应该接收一堆tiff并将它们放在一起。我让它适用于我读入的大多数图像文件,但是当我尝试读入它们时,其中很大一部分会抛出错误。
这是我的代码片段:
int numPages = 0;
inStream = ImageIO.createImageInputStream(imageFile);
reader.setInput(inStream);
while(true){
bufferedImages.add(reader.readAll(numPages, reader.getDefaultReadParam()));
numPages++;
}
是的,我捕获了越界异常,因此我们不必担心这一点。我的问题是我收到以下错误:
javax.imageio.IIOException: I/O error reading image metadata! at com.sun.media.imageioimpl.plugins.tiff.TIFFImageReader.readMetadata(TIFFImageReader.java:340) at com.sun.media.imageioimpl.plugins.tiff.TIFFImageReader.seekToImage(TIFFImageReader.java:310) at com.sun.media.imageioimpl.plugins.tiff.TIFFImageReader.prepareRead(TIFFImageReader.java:971) at com.sun.media.imageioimpl.plugins.tiff.TIFFImageReader.read(TIFFImageReader.java:1153) at javax.imageio.ImageReader.readAll(ImageReader.java:1067) at sel.image.appender.ImageAppender.mergeImages(ImageAppender.java:59) at sel.imagenow.processor.AetnaLTCProcessor.processBatch(AetnaLTCProcessor.java:287) at sel.imagenow.processor.AetnaLTCProcessor.processImpl(AetnaLTCProcessor.java:81) at sel.processor.AbstractImageNowProcessor.process(AbstractImageNowProcessor.java:49) at sel.RunConverter.main(RunConverter.java:37)
Caused by: java.io.EOFException at javax.imageio.stream.ImageInputStreamImpl.readShort(ImageInputStreamImpl.java:229) at javax.imageio.stream.ImageInputStreamImpl.readUnsignedShort(ImageInputStreamImpl.java:242) at com.sun.media.imageioimpl.plugins.tiff.TIFFIFD.initialize(TIFFIFD.java:194) at com.sun.media.imageioimpl.plugins.tiff.TIFFImageMetadata.initializeFromStream(TIFFImageMetadata.java:110) at com.sun.media.imageioimpl.plugins.tiff.TIFFImageReader.readMetadata(TIFFImageReader.java:336) ... 9 more
我确实确保添加了正确的 JAI 库,并且我的阅读器正在使用“TIFF”类型,因此阅读器(和编写器)是正确的,但由于某种原因元数据是错误的。现在我可以在 Windows 中正常打开并查看所有这些图像,因此它们确实没有损坏或任何东西。 Java 只是不想正确地读取它们。因为我只是使用流肉数据稍后将它们写出来,所以我不太关心元数据,我只需要它将文件读入列表,以便我可以附加它。我确实在 writer 上找到了 writer.replaceImageMetaData 方法,但 IOWriter 的 TIFFwriter 版本没有相应的代码。我被困住了,有人吗?有没有办法读取部分元数据以查看错误并修复它?
最佳答案
对于任何想知道我最终解决了自己的问题的人。图像元数据似乎有点搞砸了。因为我只是进行简单的合并,并且因为我知道每个图像都是一页,所以我能够使用缓冲图像来读取图片,然后将其设为具有空元数据的 IIOImage。我使用流元数据(有效)来合并图像。这是我用来合并图像列表的完整方法:
public static File mergeImages(List<File> files, String argID, String fileType, String compressionType) throws Exception{
//find the temp location of the image
String location = ConfigManager.getInstance().getTempFileDirectory();
logger_.debug("image file type [" + fileType + "]");
ImageReader reader = ImageIO.getImageReadersByFormatName(fileType).next();
ImageWriter writer = ImageIO.getImageWritersByFormatName(fileType).next();
//set up the new image name
String filePath = location + "\\" + argID +"." + fileType;
//keeps track of the images we copied from
StringBuilder builder = new StringBuilder();
List<IIOImage> bufferedImages = new ArrayList<IIOImage>();
IIOMetadata metaData = null;
for (File imageFile:files) {
//get the name for logging later
builder.append(imageFile.getCanonicalPath()).append("\n");
if (metaData == null){
reader.setInput(ImageIO.createImageInputStream(imageFile));
metaData = reader.getStreamMetadata();
}
BufferedImage image = ImageIO.read(imageFile);
bufferedImages.add(new IIOImage(image, null, null));
}
ImageWriteParam params = writer.getDefaultWriteParam();
if (compressionType != null){
params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
params.setCompressionType(compressionType);
}
ImageOutputStream outStream = null;
try{
outStream = ImageIO.createImageOutputStream(new File(filePath));
int numPages = 0;
writer.setOutput(outStream);
for(IIOImage image:bufferedImages){
if (numPages == 0){
writer.write(metaData, image, params);
}
else{
writer.writeInsert(numPages, image, params);
}
numPages++;
}
}
finally{
if (outStream != null){
outStream.close();
}
}
//set up the file for us to use later
File mergedFile = new File(filePath);
logger_.info("Merged image into [" + filePath + "]");
logger_.debug("Merged images [\n" + builder.toString() + "] into --> " + filePath);
return mergedFile;
}
我希望这对其他人有帮助,因为我知道在这个问题上我找不到太多东西。
关于java - 使用 imageIO 读取 Tiff 图像元数据时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18149945/
在javax.imageio.ImageIO中,有一个方法#write(RenderedImage im, String formatName, OutputStream output),它接受开发人
我对此问题感到非常困惑。我在jai-imageio-core上使用的是1.3.0版本,请检查下面的依赖关系,我完全不知道如何从jar中找出如何在JVM中加载一个类文件(RawImageReaderSp
我的应用程序正在将图像保存到文件夹中。同时另一个软件监视该文件夹并打印粘贴的图像。 我遇到的问题是打印应用程序可以在打印机上发送一半渲染的图像,或者根本不对保存的图像使用react。 我正在使用 ja
在下面的代码片段中,我尝试使用 javax.imageio.ImageIO 设置我的 JFrame 实例的图标,但出现以下异常。你能告诉我我缺少什么吗? import javax.imagei
我正在尝试将 Spring Web 应用程序部署到在 Windows Azure 上的生产环境中运行的 Tomcat 7(尝试过 Ubuntu 和 Windows Datacenter VM)。遗憾的
在使用套接字通过网络传输图像时,我遇到了一个奇怪的问题: 当我使用 ImageIO.write() 将图像写入一个套接字的 OutputStream 并使用 ImageIO.write() 从另一个套
下面您将看到一张来自土耳其的名为“simit”的精美糕点图片。它取自 iPad 2,因此它是尺寸为 720*960 的 JPEG。 问题是,当我使用 javax.imageio.ImageIO.rea
我在 Tomcat 5.5 中有一个 Servlet,它读取文件夹中的本地镜像。然后将图像发送回 Applet。 我收到此消息“javax.imageio.IIOException:无法创建 Imag
我有一张图片,称之为 grayscale.jpg。现在我在 The Gimp 中打开该图像并将颜色模式更改为 RGB 并将其保存为 color.jpg。如果我在任何图像查看器中查看 grayscale
这个问题在这里已经有了答案: Can't import javax.imageio.ImageIO in Android application (1 个回答) 关闭 9 年前。 当我试图做的时候,
我想将 Canvas 对象保存为图像,为此我想使用 ImageIO 类。我正在使用 Eclipse,但是当我尝试导入此库时(导入 javax.imageio.ImageIO;)Eclipse 向我显示
protected void doGet(HttpServletRequest req, HttpServletResponse response) throws IOExceptio
我正在尝试通过套接字发送图像,但我遇到了一个奇怪的问题。ImageIO.write 发送的数据比 ImageIO.read 接收的数据多。例如,如果我在循环中有以下代码: (客户端) out.writ
我在 python 中处理一些图像,我正在尝试将一系列大小为 961x509 的图像转换为 MP4 电影文件。我已经这样做了并且它正在工作但是我有一个非常烦人的问题,警告说是这样的: WARNING:
Apple 的图像 I/O 编程指南说道: Image I/O resides in the Application Services framework in Mac OS X, and in th
我一直在开发一个程序,其中使用来自此 API (musicg) 的代码:http://code.google.com/p/musicg/ 但是,我的代码中仍有一部分给我带来了麻烦(GraphicRen
我无法加载 JAI 1.3.0 的 ImageIO 类。 Java 6 和 Web 应用程序服务器 (WAS) 8.5。我的代码适用于 Java 6 和 WAS(7.0.19)。 我已经在 pom.x
我一直在使用 javax.imageio.ImageIO 中的 ImageIO.read() 和 ImageIO.write() 方法来读取和写入图像,我发现有些图像的颜色发生了奇怪的变化。 即使我将
如果图像不是RGB颜色,如何解码图像。它应该通过支持所有格式(Jpg、Png、Gif来解码图像) code>..etc) 任何 api 都可以解码。 这是失败的代码行。那么可以使用哪种方法来解决该问题
以下测试在 Java 9 上失败,而在 Java 8 中通过: @Test public void getImage_SetValueUsingConstructor_ShouldReturnCorr
我是一名优秀的程序员,十分优秀!