java - 使用 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();
}
解决方案
找到了解决方案。对于这个 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;
}
推荐阅读
- python - Python Numpy 初学者:获取形状为 ((M,N),(M,N)) 的数组
- reactjs - 在 ReactJS 中没有渲染方法的渲染组件
- regex - 带有条件和后缀的正则表达式
- javascript - JS:使用字典比遍历数组更快吗?
- android - 当应用程序的多个页面在 Kotlin 中具有相同的 Activity 名称时,如何启动 Android Activity?
- etl - Source 和 Source Qualifier 之间的字段顺序需要相同吗?
- c# - 连接多个表并返回表 2 中的最后一条记录
- jpa - 使用 JPA CriteriaBuilder 的多级子查询
- apache-kafka - 如何将具有显式状态存储的 KTable-KTable leftJoin 从 Kafka 0.11 迁移到 Kafka 2.0?
- javascript - 检查反应用户是否有角色