首页 > 解决方案 > 使用 Twelvemonkeys ImageIO 读取 TIFF ICC 配置文件

问题描述

我需要从 TIFF 文件中提取嵌入的 ICC 配置文件。我可以阅读IIOMetadata并且我的 IDE 显示ifd包含 ICC 配置文件的字段(标签 ID 34675)。但是我怎样才能把它读到一个ICC_Profile对象上呢?

ImageInputStream input = ImageIO.createImageInputStream(file);

try {
    ImageReader reader = ImageIO.getImageReaders(input).next();
    if (reader == null) {
        throw new IllegalArgumentException("No image reader for file: " + file);
    }

    try {
        reader.setInput(input);
        IIOMetadata metadata = reader.getImageMetadata(0);
        // metadata contains a field "ifd" containing the ICC profile
        // How to extract it?

    } finally {
        reader.dispose();
    }

} finally {
    input.close();
}

标签: javajavax.imageiotwelvemonkeys

解决方案


找到了解决方案。对于这个 Twelvemonkeys 包imageio-metadata在版本 3.4 中是需要的。旧版本不包含TIFFEntry类。

 /**
 * Extract ICC profile from an image file.
 *
 * @param file image file
 * @return ICC profile
 * @throws IOException on file errors
 */
protected ICC_Profile extractICCProfile(File file) throws IOException {

    ICC_Profile profile;

    try (ImageInputStream input = ImageIO.createImageInputStream(file)) {
        ImageReader reader = ImageIO.getImageReaders(input).next();
        if (reader == null) {
            throw new IllegalArgumentException("No image reader for file: " + file);
        }

        try {
            reader.setInput(input);
            TIFFImageMetadata metadata = (TIFFImageMetadata) reader.getImageMetadata(0);
            TIFFEntry entry = (TIFFEntry) metadata.getTIFFField(TIFF.TAG_ICC_PROFILE);
            byte[] iccBytes = (byte[]) entry.getValue();
            profile = ICC_Profile.getInstance(iccBytes);
        } finally {
            reader.dispose();
        }
    }

    return profile;
}

推荐阅读