当前位置: 首页 > 知识库问答 >
问题:

使用imageIO读取Tiff图像元数据时出现的问题

夏侯兴学
2023-03-14

我在写一个程序,它应该接受一堆tiff的,并把它们放在一起。我让它对我读入的大多数图像文件都起作用,但当我尝试读入它们时,它们中的一大部分会抛出一个错误。

int numPages = 0;           
inStream = ImageIO.createImageInputStream(imageFile);
reader.setInput(inStream);

while(true){
    bufferedImages.add(reader.readAll(numPages, reader.getDefaultReadParam()));
    numPages++;
}

是的,我捕捉到了越界异常,所以我们不用担心这个。我的问题是我得到以下错误:

iIOException:读取图像元数据时出现I/O错误!在com.sun.media.imageioimpl.plugins.tiff.tiffimagereader.reada元数据(tiffimagereader.java:340)在com.sun.media.imageioimpl.plugins.tiff.tiffimagereader.seektoImage(tiffimagereader.java:310)在com.sun.media.imageioimpl.plugins.tiff.tiffimagereader.prepareread(tiffimagereader.java:971)在

原因:java.io.eofException在javax.imageo.Stream.ImageInputStreamImpl.ReadShort(imageInputStreamImpl.java:229)在javax.imageo.Stream.ImageInputStreamImpl.ReadUnignedShort(imageInputStreamImpl.java:242)在com.sun.media.imageoImpl.plugins.tiff.tiffifd.initialize(tiffifd.java:194)在

我确实确保添加了正确的JAI lib,并且我的阅读器使用了“tiff”类型,所以阅读器(和写入器)是正确的,但是由于某种原因元数据是错误的。现在我可以打开和查看所有这些图像正常在窗口,所以他们真的没有损坏或任何东西。Java只是不想正确地理解它们。由于我只是使用流meatadata来写出它们,所以我不太关心元数据,我只需要它读入文件到列表中,这样我就可以追加它了。我确实在writer上找到了一个writer.ReplaceImageMetadata方法,但IOWriter的TIFFwriter版本没有该方法的代码。我卡住了,有人说什么吗?有没有一种方法可以读入元数据的一部分,看看哪里出了问题并加以修复?

共有1个答案

杜弘伟
2023-03-14

对任何想知道的人来说,我最终解决了我自己的问题。看起来图像元数据有点搞砸了。因为我只是在做一个简单的合并,而且我知道每个图像都是一个页面,所以我能够使用一个缓冲的图像来读取图片,然后将它变成一个包含null元数据的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;

}

我希望这能帮助其他人,因为我知道在这个问题上我找不到太多东西。

 类似资料:
  • 我目前正在编写一个应用程序来读取TIFF文件,然后执行一些压缩算法。我已经成功地做到了这一点...但是现在,我想读取TIFF图像的元数据,但似乎找不到正确的方法。 我应该使用什么库和函数?

  • 如何从Python中的TIFF图像中读取元数据(如坐标)?我尝试了来自PIL的,但收到消息: AttributeError:“TiffImageFile”对象没有属性“\u getexif” 有可能用PIL得到它吗?

  • 我试图使用open JDK11ImageIO、ImageReader和ImageWriter类将多个输入TIFF文件合并为一个多页输出TIFF文件。我的例程对从许多不同品牌的扫描设备创建的几乎所有示例输入文件都能正常工作。这些设备使用旧的和新的JPEG压缩生成各种TIFF文件。然而,来自一个特定设备的TIFF文件会导致具有粉红色背景的错误输出。更奇怪的是,用纵向扫描产生的TIFF会产生正确的输出,

  • 问题内容: 我尝试了以下代码来完成读取和写入tiff图像的任务: 但是,当我运行代码时,出现以下错误消息: 知道如何解决这个问题吗? 问题答案: 读取TIFF并输出BMP的最简单方法是使用ImageIO类: 要使此功能正常工作,您唯一需要做的另一件事是确保已将JAI ImageIO JAR添加到类路径中,因为如果没有此库中的插件,JRE不会处理BMP和TIFF。 如果由于某种原因不能使用JAI I

  • 问题内容: 给定一些源文件(或更通用的输入流),我需要找出 它是图像吗 如果它是图像,则检索其类型(png / jpeg / gif / etc) 检索exif数据(如果有) 我看了看API,但尚不清楚如何获取图像或Exif数据的类型。 问题答案: 几年前,我上一次不得不这样做时,标准API无法读取EXIF数据。该库可以这样做: http://www.drewnoakes.com/code/exi

  • 堆栈: Java-1.80_91 Scala-2.11.8 库-it.geosolutions.imageio-extImageio-ext-tiff 1.1.15 我们正在阅读大量旧的TIF图像,由于某些原因,读取高度不一致-由于某些原因,在不同的运行中读取同一图像可能会成功,也可能会失败- 代码如下: 问题是ImageIO同时初始化2个TIFF阅读器 或 第一个失败,第二个工作。如何从Imag