You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Java TIFFImageWriter替代C的TIFFWriteEncodedStrip写入TIFF文件

在Java中配置TIFFDirectory后,使用TIFFImageWriter写入像素字节数组的实现方法

问题背景

已创建配置好TIFFFields的TIFFDirectory,需要将处理后的像素字节数组(类似C代码中累积的image_buffer,按行存储1位黑白图像的位流,MSB优先)通过TIFFImageWriter写入TIFF文件,压缩方式为T4_COMPRESSION_T4_1D。

实现步骤与代码示例

1. 获取TIFFImageWriter实例并配置输出流

// 获取TIFF格式的ImageWriter
ImageWriter tiffWriter = ImageIO.getImageWritersByFormatName("TIFF").next();

// 绑定输出文件流
try (FileOutputStream fos = new FileOutputStream("output.tif");
     ImageOutputStream ios = ImageIO.createImageOutputStream(fos)) {
    tiffWriter.setOutput(ios);

2. 配置T4压缩参数

对应T4_1D压缩,需指定压缩类型为CCITT T.4(对应TIFF压缩代码2),并设置压缩模式:

// 获取TIFF专属的写入参数
    TIFFImageWriteParam writeParam = (TIFFImageWriteParam) tiffWriter.getDefaultWriteParam();
    writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    // 设置T4 1D压缩类型
    writeParam.setCompressionType(TIFFImageWriteParam.COMPRESSION_CCITTFAX3);
    // 传真压缩质量固定为1.0
    writeParam.setCompressionQuality(1.0f);

3. 将字节数组转换为BufferedImage

由于是1位黑白图像,需创建匹配的SampleModel和Raster,确保位顺序与C代码一致(MSB优先):

// 图像参数:替换为实际的宽度、高度
    int imageWidth = 2048;
    int imageHeight = 1728;
    byte[] imageBuffer = ...; // 你的像素字节数组(与C代码中image_buffer一致)

    // 创建1位、单通道、MSB优先的SampleModel
    SampleModel sampleModel = new MultiPixelPackedSampleModel(
        DataBuffer.TYPE_BYTE, imageWidth, imageHeight, 1
    );
    DataBufferByte dataBuffer = new DataBufferByte(imageBuffer, imageBuffer.length);
    WritableRaster raster = Raster.createWritableRaster(sampleModel, dataBuffer, null);

    // 生成BufferedImage,使用对应色彩模型(白为0,与C代码逻辑匹配)
    ColorModel colorModel = new ComponentColorModel(
        ColorSpace.getInstance(ColorSpace.CS_GRAY),
        new int[]{1}, true, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE
    );
    BufferedImage tiffImage = new BufferedImage(colorModel, raster, false, null);

4. 关联TIFFDirectory并写入文件

将配置好的TIFFDirectory作为元数据传入,完成写入:

// 关联已配置的TIFFDirectory作为图像元数据
    IIOImage iioImage = new IIOImage(tiffImage, null, yourConfiguredTIFFDirectory);
    tiffWriter.write(null, iioImage, writeParam);
} finally {
    tiffWriter.dispose();
}

关键注意事项

  • TIFFDirectory配置校验:需确保已正确设置以下字段:
    • ImageWidth/ImageLength:匹配实际图像尺寸
    • BitsPerSample:设为1
    • SamplesPerPixel:设为1
    • PhotometricInterpretation:设为0(WhiteIsZero,与C代码中"以白色开头"的run逻辑匹配)
    • Compression:设为2(对应T4_1D压缩,也可通过TIFFTag.COMPRESSION常量设置)
  • 字节数组行对齐:TIFF要求每行字节数向上取整到8位边界,若图像宽度不是8的倍数,需确保imageBuffer中每行已填充补位字节(C代码中已处理此逻辑,需保证Java端字节数组与之一致)

内容的提问来源于stack exchange,提问作者greg2java

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:16:22