Проблема с цветовым профилем изображения Java

Я изменяю размер своих изображений с помощью imageio, но изображения, использующие цветовой профиль sRGB IEC61966-2.1- IEC 61966-2.1 Default RGB colour space, получаются зеленоватыми:

Исходное изображение:

Исходное изображение

Выходное изображение:

Выходное изображение

Странно то, что imageio как-то ломается во время выполнения. Перезапуск моей JVM каким-то образом решает проблему, и это не происходит какое-то время. Другие изображения, которые не используют этот специальный цветовой профиль, изменяются очень хорошо.

Я запускаю JDK 1.8.0_25 и использую следующие банки изображений:

  • jai_imageio-1.1.jar
  • jmage-0.7-2.jar
  • image4j-0.7.jar
  • jai_codec-1.1.3.jar
  • jai_core-1.1.3.jar

Может быть, кто-то уже сталкивался с этой проблемой?


person Jotschi    schedule 01.03.2017    source источник
comment
Пожалуйста, добавьте MCVE, который раскрывает проблему. Я написал небольшой пример программы, которая без проблем передискретизировала изображение и сохранила его.   -  person Harald K    schedule 01.03.2017


Ответы (1)


Вот пример кода, который работает для меня. Я использую немного более обновленную версию Java.

$ java -version
java version "1.8.0_121"

Исходный код:

public static void main(String[] args) throws IOException {
    BufferedImage image = ImageIO.read(new File(args[0]));

    BufferedImageOp op = new AffineTransformOp(AffineTransform.getScaleInstance(1.43, 1.43), AffineTransformOp.TYPE_BICUBIC);
    Rectangle bounds = op.getBounds2D(image).getBounds();
    // NOTE: Passing null as last param to filter() works fine, but creates a destination 
    // image (TYPE_INT_ARGB) that JPEGImageWriter will write in a way other software 
    // interprets as CMYK rather than ARGB. It does not look like your result image, though... 
    // And, it works fine if you write the image as PNG, even if passing null.
    BufferedImage result = op.filter(image, new BufferedImage(bounds.width, bounds.height, BufferedImage.TYPE_3BYTE_BGR));

    ImageIO.write(result, "PNG", new File("foo.png")); 
    ImageIO.write(result, "JPEG", new File("foo.jpg"));
}

В результате foo.jpg выглядит так:

введите здесь описание изображения

person Harald K    schedule 01.03.2017