Сохранение цветового пространства в формате JPEG - PullRequest
2 голосов
/ 07 апреля 2011

У меня есть сервлет для конвертации и кэширования небольших версий фотографий. Это реализовано с использованием java.awt.image + javax.imageio и стороннего фильтра повторной выборки. Все оригиналы загружены с цветным профилем sRGB. Когда я повторяю выборку и сохраняю их снова, они все еще находятся в sRGB, однако это не записывается в сохраненном файле.

Как я могу убедиться, что эта информация сохранена в файле?

Если вам интересно, что это меняет дело, изображения без профиля на моем экране (Safari + OSX + Calibrated screen) гораздо более насыщенные, чем при правильном профиле sRGB. Также я уверен, что это недостающая информация профиля, а не алгоритм повторной выборки.

1 Ответ

0 голосов
/ 09 апреля 2011

Оказывается, достаточно включить EXIF-тег ColorSpace = 1, который указывает, что он должен обрабатываться как sRGB.Это удалось сделать с помощью Apache Commons Sanselan.К сожалению, эта библиотека не завершена, поэтому ее можно использовать для изменения EXIF ​​только после создания файла.

Соответствующий код, основанный на примере Sanselan:

public void addExifMetadata(File jpegImageFile, File dst)
            throws IOException, ImageReadException, ImageWriteException {
        OutputStream os = null;
        try {
            TiffOutputSet outputSet = new TiffOutputSet();

            TiffOutputField colorspace = TiffOutputField.create(
                        TiffConstants.EXIF_TAG_COLOR_SPACE, outputSet.byteOrder, new Integer(1));
            TiffOutputDirectory exifDirectory = outputSet.getOrCreateExifDirectory();
            exifDirectory.add(colorspace);

            os = new FileOutputStream(dst);
            os = new BufferedOutputStream(os);
            new ExifRewriter().updateExifMetadataLossless(jpegImageFile, os, outputSet);

            os.close();
            os = null;
        } finally  {
            if (os != null)
                try {
                    os.close();
                } catch (IOException e) {

                }
        }
    }
...