BufferedImage & ColorModel в Java - PullRequest
       27

BufferedImage & ColorModel в Java

1 голос
/ 08 апреля 2010

Я использую библиотеку обработки изображений в Java для манипулирования изображениями. Первый шаг, который я делаю, - это чтение изображения и создание объекта java.awt.Image.BufferedImage. Я делаю это таким образом,

BufferedImage sourceImage = ImageIO.read( new File( filePath ) );

Приведенный выше код создает объект BufferedImage с DirectColorModel:

rmask = FF0000
gmask = ff00
bmask = ФФ
amask = 0.

Вот что происходит, когда я запускаю приведенный выше код на своем MacBook.

Но когда я запускаю этот же код на машине linux (размещенном сервере), это создает объект BufferedImage с ColorModel:

pixelBits = 24
numComponents = 3
цветовое пространство = java.awt.color.ICC_ColorSpace@c39a20
прозрачность = 1 имеет альфа = ложь
isAlphaPre = false.

Я использовал одно и то же изображение jpg в обоих случаях. Я не знаю, почему ColorModel одного и того же изображения отличается при запуске на Mac и Linux. ColorModel для Mac имеет 4 компонента, а colormodel для Linux - 3 компонента.

Существует проблема, возникающая из-за этого, библиотека обработки изображений, которую я использую, всегда предполагает, что в ColorModel всегда передается 4 компонента, и при запуске на linux box она выбрасывает исключение массива из границ. , Но на MacBook он работает нормально.

Добавив немного больше информации, Как только изображение прочитано, я распечатал image.getType()

  • На Mac -> возвращает TYPE_INT_RGB (значение 1)
  • В Linux -> возвращает TYPE_3BYTE_BGR (значение 5)

Я не уверен, что делаю что-то не так или есть проблема с библиотекой. Пожалуйста, поделись своими мыслями. Также задавайте мне любые вопросы, если я не имею смысла!

Ответы [ 2 ]

4 голосов
/ 08 апреля 2010

Я не знаю точно, почему вы получаете две разные цветовые модели, хотя я считаю, что они совершенно одинаковы. DirectColorModel имеет 4 компонента, но альфа-маска равна 0, так что фактически она имеет только 3 компонента, как и другой.

Я предлагаю написать простую вспомогательную функцию, которая гарантирует, что изображение имеет правильную цветовую модель, прежде чем передать ее в эту библиотеку изображений. Вспомогательная функция может использовать http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/ColorConvertOp.html или использовать что-то вроде следующего кода (не проверено):

private static BufferedImage makeCompatible(BufferedImage image) {
  int w = image.getWidth();
  int h = image.getHeight();

  BufferedImage result = new BufferedImage(w, h, BufferedImage.TYPE_4BYTE_ABGR);
  Graphics2D g = result.createGraphics();
  g.drawRenderedImage(image, new AffineTransform()); //or some other drawImage function
  g.dispose();

  return result;
}

Предполагая, что библиотека способна обрабатывать BufferedImage.TYPE_4BYTE_ABGR. В противном случае вам придется поставить что-то еще здесь. И, конечно, вы можете проверить, имеет ли исходное изображение правильный формат, прежде чем конвертировать его.

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

Добавив немного больше информации, Как только изображение прочитано, я распечатал image.getType ()

  • На Mac -> он возвращает TYPE_INT_RGB (значение 1)
  • В Linux -> возвращает TYPE_3BYTE_BGR (значение 5)
...