Java 1.5.0_16 искажает цвета при сохранении изображения jpg - PullRequest
4 голосов
/ 02 мая 2010

у меня есть загруженное изображение с диска (сохранено как BufferedImage), которое я правильно отображаю на JPanel, но когда я пытаюсь повторно сохранить это изображение, используя команду ниже, изображение сохраняется в красноватом оттенок.

ImageIO.write(image, "jpg", fileName);

Внимание! image - это BufferedImage, а fileName - это объект File, указывающий на имя файла, который будет сохранен, и заканчивается на ".jpg".

Я читал, что были проблемы с ImageIO методами в более ранних JDK, но я не на одной из этих версий, насколько я мог найти. То, что я ищу, - это способ исправить эту проблему без обновления JDK, однако, сказав, что я все еще хотел бы знать, в каком JDK эта проблема была исправлена ​​(если это действительно ошибка с JDK, который я использую ).

Спасибо.

Ответы [ 3 ]

5 голосов
/ 02 мая 2010

Ладно, решил мою проблему, похоже, мне нужно по какой-то причине преобразовать изображение в BufferedImage.TYPE_INT_RGB. Я думаю, что альфа-каналы могут обрабатываться неправильно на каком-то слое.

3 голосов
/ 02 мая 2010

Я бы сначала начал с исследования, является ли проблема цветовой моделью BifferedImage или кодировкой jpeg. Вы можете попробовать изменить тип изображения (3-й аргумент в конструкторе ), чтобы увидеть, если это приведет к разнице, а также использовать JPEGCodec напрямую для сохранения JPEG.

* 1005 Е.Г. *

 BufferedImage bufferedImage = ...;  // your image
 out = new FileOutputStream ( filename );
 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder ( out );
 JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam ( bufferedImage );
 encoder.setJPEGEncodeParam ( param );
 encoder.encode ( bufferedImage );
 out.close();

РЕДАКТИРОВАТЬ: изменил текст, это тип изображения, который вы хотите изменить. Смотрите ссылку на конструктор.

1 голос
/ 02 мая 2010

Другой подход заключается в рендеринге изображения в буфере TYPE_INT_ARGB, с DirectColorModel с альфа-каналом, как показано ниже и предлагает здесь .

private BufferedImage process(BufferedImage old) {
    int w = old.getWidth();
    int h = old.getHeight();
    BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = img.createGraphics();
    g2d.drawImage(old, 0, 0, null);
    g2d.dispose();
    return img;
}
...