Прочитать профиль 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.

Другие вопросы по тегам