1

我需要从 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();
}
4

2 回答 2

1

找到了解决方案。对于这个 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;
}
于 2019-01-15T16:22:19.540 回答
1

您可以使用类的getProfile()功能ICCProfile

用法:

int profileId = ...; 
ICCProfile iccp = new ICCProfile(profileId, input);
ICC_Profile icc_p = iccp.getProfile();

根据google result #1 for Decembermonkeys icc_profile的代码。

于 2019-01-15T14:32:06.900 回答