java读取tif文件页数_Java 如何将多个 BufferedImage 转成一个多页 TIFF 格式的 base64?...

本文介绍了如何使用 Java 和 TwelveMonkeys ImageIO 库将一个多页 TIFF 图片转换为 base64 字符串。在尝试过程中遇到的问题是,生成的 base64 字符串只能正常显示第一页,后续页面显示为黑色。解决方案包括使用 ImageWriter.writeToSequence 方法,设置正确的压缩模式和质量,并确保每一页都被正确写入和编码。
摘要由CSDN通过智能技术生成

项目需求:

使用 Java ImageIO 搭配 TwelveMonkeys ImageIO 库,要把多个 BufferedImage(由一个多页 TIFF 图片而来,因为要对每一页做一些处理)转成 base64。

尝试:

用 ImageWriter.writeToSequence 方法先把 BufferedImage 输出到 ByteArrayOutputStream

再用 DatatypeConverter 把从 ByteArrayOutputStream 取得的 byte[] 转成 base64

结果:

但是转出来的 base64 String 图片仅第一页可正常显示,之后二三等页皆漆黑一片无法显示。

要怎么修正才能产生每一页皆正常的 base64 图形呢?

import javax.imageio.*;

import javax.imageio.stream.ImageInputStream;

import javax.imageio.stream.ImageOutputStream;

import javax.xml.bind.DatatypeConverter;

import java.awt.image.BufferedImage;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.util.Iterator;

class MultipageTIFFToBase64 {

public static void main(String[] args) throws IOException {

File multipageTIFF = new File("multipage.tiff");

BufferedImage[] imagePages = readMultipageTIFF(multipageTIFF);

String base64 = convertToBase64String(imagePages);

System.out.println(base64);

}

public static String convertToBase64String(BufferedImage[] imagePages) throws IOException {

String base64String;

byte[] imageBytes;

ImageWriter imageWriter = null;

try (

ByteArrayOutputStream bao = new ByteArrayOutputStream();

ImageOutputStream ios = ImageIO.createImageOutputStream(bao)

) {

Iterator imageWriterIterator = ImageIO.getImageWritersByFormatName("TIFF");

imageWriter = imageWriterIterator.next();

imageWriter.setOutput(ios);

ImageWriteParam params = imageWriter.getDefaultWriteParam();

params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);

params.setCompressionType("JPEG");

params.setCompressionQuality(1f);

imageWriter.prepareWriteSequence(null);

for (int i = 0; i < imagePages.length; i++) {

BufferedImage imagePage = imagePages[i];

IIOImage iioImage = new IIOImage(imagePage, null, null);

imageWriter.writeToSequence(iioImage, params);

}

imageWriter.endWriteSequence();

imageBytes = bao.toByteArray();

} catch (IOException e) {

if (imageWriter != null) {

imageWriter.abort();

}

throw e;

} finally {

if (imageWriter != null) {

imageWriter.dispose();

}

}

base64String = DatatypeConverter.printBase64Binary(imageBytes);

return base64String;

}

public static BufferedImage[] readMultipageTIFF(File tiffFile) throws IOException {

BufferedImage[] imagePages;

ImageReader imageReader = null;

try (

FileInputStream fis = new FileInputStream(tiffFile);

ImageInputStream iis = ImageIO.createImageInputStream(fis)

) {

Iterator imageReaderIterator = ImageIO.getImageReaders(iis);

imageReader = imageReaderIterator.next();

imageReader.setInput(iis);

int numImagePages = imageReader.getNumImages(true);

imagePages = new BufferedImage[numImagePages];

for (int i = 0; i < numImagePages; i++) {

BufferedImage imagePage = imageReader.read(i);

imagePages[i] = imagePage;

}

} catch (IOException e) {

if (imageReader != null) {

imageReader.abort();

}

throw e;

} finally {

if (imageReader != null) {

imageReader.dispose();

}

}

return imagePages;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值