首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将多页TIFF图像拆分为单独的图像(Java)

将多页TIFF图像拆分为单独的图像(Java)
EN

Stack Overflow用户
提问于 2013-07-21 15:31:37
回答 7查看 27.3K关注 0票数 15

在这件事上我都抓狂了。

如何将多页/多层TIFF图像拆分为几个单独的图像?

演示图像可用here

(首选纯Java (即非本机)解决方案。如果解决方案依赖于商业化的库,这并不重要。)

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-09-11 18:33:58

您可以使用TIFF高级成像库JAI来拆分多页,方法是使用以下ImageReader:

代码语言:javascript
复制
ImageInputStream is = ImageIO.createImageInputStream(new File(pathToImage));
if (is == null || is.length() == 0){
  // handle error
}
Iterator<ImageReader> iterator = ImageIO.getImageReaders(is);
if (iterator == null || !iterator.hasNext()) {
  throw new IOException("Image file format not supported by ImageIO: " + pathToImage);
}
// We are just looking for the first reader compatible:
ImageReader reader = (ImageReader) iterator.next();
iterator = null;
reader.setInput(is);

然后你可以得到页数:

代码语言:javascript
复制
nbPages = reader.getNumImages(true);

和单独阅读页面:

代码语言:javascript
复制
reader.read(numPage)
票数 29
EN

Stack Overflow用户

发布于 2013-11-27 07:33:36

我在上面的示例中使用了我找到的一个名为imageio-tiff的tiff插件。

Maven依赖:

代码语言:javascript
复制
<dependency>
        <groupId>com.tomgibara.imageio</groupId>
        <artifactId>imageio-tiff</artifactId>
        <version>1.0</version>
        </dependency>

我能够从tiff资源中获得缓冲的图像:

代码语言:javascript
复制
   Resource img3 = new ClassPathResource(TIFF4);
            ImageInputStream is = ImageIO.createImageInputStream(img3.getInputStream());

            Iterator<ImageReader> iterator = ImageIO.getImageReaders(is);
            if (iterator == null || !iterator.hasNext()) {
                throw new IOException("Image file format not supported by ImageIO: ");
            }
            // We are just looking for the first reader compatible:
            ImageReader reader = (ImageReader) iterator.next();
            iterator = null;
            reader.setInput(is);
            int nbPages = reader.getNumImages(true);

            LOGGER.info("No. of pages for tiff file is {}", nbPages);
  BufferedImage image1 = reader.read(0);
        BufferedImage image2 = reader.read(1);
        BufferedImage image3 = reader.read(2);

但随后我发现了另一个名为apache commons Maven dependency的项目:

代码语言:javascript
复制
<dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-imaging</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

在一行代码中,您可以获得缓冲的图像:

代码语言:javascript
复制
 List<BufferedImage> bufferedImages = Imaging.getAllBufferedImages(img3.getInputStream(), TIFF4);
        LOGGER.info("No. of pages for tiff file is {} using apache commons imaging", bufferedImages.size());

然后写入文件sample:

代码语言:javascript
复制
 final Map<String, Object> params = new HashMap<String, Object>();
        // set optional parameters if you like
        params.put(ImagingConstants.PARAM_KEY_COMPRESSION, new Integer(TiffConstants.TIFF_COMPRESSION_CCITT_GROUP_4));
        int i = 0;
        for (Iterator<BufferedImage> iterator1 = bufferedImages.iterator(); iterator1.hasNext(); i++) {
            BufferedImage bufferedImage = iterator1.next();
            LOGGER.info("Image type  {}", bufferedImage.getType());
            File outFile = new File("C:\\tmp" + File.separator + "shane" + i + ".tiff");
            Imaging.writeImage(bufferedImage, outFile, ImageFormats.TIFF, params);
        }

实际上测试性能,apache要慢得多……

或者使用旧版本的iText,它要快得多:

代码语言:javascript
复制
private ByteArrayOutputStream convertTiffToPdf(InputStream imageStream) throws IOException, DocumentException {
    Image image;
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    Document document = new Document();
    PdfWriter writer = PdfWriter.getInstance(document, out);
    writer.setStrictImageSequence(true);
    document.open();

    RandomAccessFileOrArray ra = new RandomAccessFileOrArray(imageStream);
    int pages = TiffImage.getNumberOfPages(ra);
    for (int i = 1; i <= pages; i++) {
        image = TiffImage.getTiffImage(ra, i);
        image.setAbsolutePosition(0, 0);
        image.scaleToFit(PageSize.A4.getWidth(), PageSize.A4.getHeight());
        document.setPageSize(PageSize.A4);
        document.newPage();
        document.add(image);
    }
    document.close();
    out.flush();
    return out;
}
票数 3
EN

Stack Overflow用户

发布于 2014-03-20 21:41:37

一种快速但非JAVA的解决方案是tiffsplit。它是libtiff库的一部分。

在tiff文件的所有层中拆分它的示例命令如下:

tiffsplit image.tif

手册页说明了一切:

代码语言:javascript
复制
NAME
       tiffsplit - split a multi-image TIFF into single-image TIFF files

SYNOPSIS
       tiffsplit src.tif [ prefix ]

DESCRIPTION
       tiffsplit  takes  a multi-directory (page) TIFF file and creates one or more single-directory (page) TIFF files
       from it.  The output files are given names created by concatenating a prefix, a lexically ordered suffix in the
       range  [aaa-zzz],  the  suffix  .tif (e.g.  xaaa.tif, xaab.tif, xzzz.tif).  If a prefix is not specified on the
       command line, the default prefix of x is used.

OPTIONS
       None.

BUGS
       Only a select set of ‘‘known tags’’ is copied when splitting.

SEE ALSO
       tiffcp(1), tiffinfo(1), libtiff(3TIFF)

       Libtiff library home page: http://www.remotesensing.org/libtiff/
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17770071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档