首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ImageIO读取TIFF ICC配置文件

使用ImageIO读取TIFF ICC配置文件
EN

Stack Overflow用户
提问于 2019-01-15 22:20:59
回答 2查看 883关注 0票数 1

我需要从TIFF文件中提取嵌入的ICC配置文件。我可以读取IIOMetadata,并且我的集成开发环境显示包含ICC配置文件的ifd字段(标签ID 34675)。但是如何将其读入ICC_Profile对象呢?

代码语言:javascript
复制
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();
}
EN

回答 2

Stack Overflow用户

发布于 2019-01-15 22:32:07

您可以使用ICCProfile类的函数getProfile()

用法:

代码语言:javascript
复制
int profileId = ...; 
ICCProfile iccp = new ICCProfile(profileId, input);
ICC_Profile icc_p = iccp.getProfile();

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

票数 1
EN

Stack Overflow用户

发布于 2019-01-16 00:22:20

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

代码语言:javascript
复制
 /**
 * 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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54200755

复制
相关文章

相似问题

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