我需要从TIFF文件中提取嵌入的ICC配置文件。我可以读取IIOMetadata,并且我的集成开发环境显示包含ICC配置文件的ifd字段(标签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();
}发布于 2019-01-15 22:32:07
您可以使用ICCProfile类的函数getProfile()。
用法:
int profileId = ...;
ICCProfile iccp = new ICCProfile(profileId, input);
ICC_Profile icc_p = iccp.getProfile();发布于 2019-01-16 00:22:20
找到了解决方案。对于这个12个metadata包,在版本3.4中需要imageio-metadata。旧版本不包含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;
}https://stackoverflow.com/questions/54200755
复制相似问题