Какие классы используются для преобразования растровых изображений и метаданных в Java 1.6?

У нас есть старый код (Java 1.2), который интенсивно использует JAI_IO для обработки изображений. Теперь у нас Java 1.6, и нам это больше не нужно. Во-первых, должен ли я по-прежнему использовать BufferedImage? Или есть класс лучше? Что мне принципиально нужно сделать, так это:

  1. Преобразование растрового изображения из одного формата в другой (обычно в PNG).
  2. Получите метаданные изображения: размер в пикселях, DPI и растровый формат.
  3. Изменение размера изображения.
  4. Нарисуйте изображение в объекте Graphics2D.
  5. пройдитесь по пикселям в растровом изображении, чтобы прочитать и/или установить их (это может быть медленным - редко используется).

И я знаю, что ответ «ха-ха-ха», но есть ли класс, который будет преобразовывать метафайлы в растровое изображение?

спасибо - Дэйв


person David Thielen    schedule 14.10.2014    source источник
comment
Что может сделать класс лучше, чем BufferedImage? Какие проблемы у вас есть с существующей настройкой? Для Java 6 я бы, вероятно, использовал стандартный javax.imageio API. При желании используйте плагины JAI ImageIO, если вам нужна поддержка содержащихся в нем форматов.   -  person Harald K    schedule 16.10.2014
comment
@haraldK - Нам нужно, чтобы BufferedImage не имел: 1) преобразовать растровое изображение в другой формат, 2) настройки DPI для растрового изображения, 3) получить формат растрового изображения.   -  person David Thielen    schedule 16.10.2014
comment
javax.imageio API подходит для этих задач. BufferedImage просто представляет данные пикселей. Существует класс IIOImage, который содержит метаданные (IIOMetadata), такие как сведения о формате файла и DPI, а также данные о пикселях (в форме BufferedImage или его суперкласса RenderedImage).   -  person Harald K    schedule 16.10.2014
comment
@haraldK - как мы можем использовать IIOImage для получения формата DPI и растрового изображения? спасибо - Дэйв   -  person David Thielen    schedule 17.10.2014


Ответы (1)


Я бы использовал ImageIO и javax.imageio API для чтения изображения и настройки DPI/PPI (пример см. ниже) и, возможно, такой пакет, как imgscalr или thumbnailator для изменения размера в зависимости от ваших потребностей/предпочтений.

Код выглядит примерно так:

// input is typically a File or InputStream

// Wrap in ImageInputStream
ImageInputStream stream = ImageIO.createImageInputStream(input);

// Obtain reader
ImageReader reader = ImageIO.getImageReaders(stream).next(); // In real code, test for presence
reader.setInput(stream);

String formatName = reader.getFormatName(); // Get the format name

ImageReadParam param = reader.getDefaultReadParam();

// ... modify params as you see fit, or just go with defaults

IIOImage image = reader.readAll(0, param);

RenderedImage red = image.getRenderedImage();
BufferedImage buf = (BufferedImage) red; // In real code, test if it's safe, or convert

// .. pas buf along to imgscalr or thumnailator

image.setRenderedImage(buf);

IIOMetadata meta = image.getMetadata();

// ... modify DPI in meta data

ImageWriter writer = reader.getImageWriter();
writer.write(null, image, null); // Or modify write params if you need (last parameter)

Вы можете увидеть пример изменения DPI для файлов JPEG здесь.

person Harald K    schedule 17.10.2014