Прочитать профиль TIFF ICC с помощью Twelvemonkeys ImageIO
Мне нужно извлечь встроенный профиль ICC из файлов TIFF. Я могу прочитать IIOMetadata
и моя IDE показывает ifd
поле, содержащее профиль ICC (идентификатор тега 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();
}
2 ответа
Нашел решение. Для этого требуется пакет imageio-метаданных Twelvemonkeys в версии 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;
}
Вы можете использовать функцию getProfile()
из ICCProfile
учебный класс.
Использование:
int profileId = ...;
ICCProfile iccp = new ICCProfile(profileId, input);
ICC_Profile icc_p = iccp.getProfile();
В соответствии с кодом в Google результат #1 для двенадцати обезьян icc_profile.