Работа с изображениями в Java: полный обзор библиотек и инструментов
Java предоставляет мощные средства для работы с растровыми изображениями — от простой загрузки и сохранения до сложной обработки с использованием фильтров и нейросетей. В этой статье мы разберём три основных подхода: встроенную библиотеку Java 2D, специализированную ImageJ и промышленный стандарт OpenCV. Вы узнаете, как выбрать подходящий инструмент и увидите рабочие примеры кода.
1. Встроенная библиотека Java 2D (javax.imageio, java.awt)
Java 2D — это часть стандартной библиотеки Java (JDK). Она не требует установки дополнительных зависимостей и идеально подходит для базовых операций: загрузка, изменение размера, обрезка, наложение текста и простые фильтры.
Основные классы:
javax.imageio.ImageIO— чтение и запись изображений (PNG, JPEG, BMP, GIF, WBMP).java.awt.image.BufferedImage— представление изображения в памяти с доступом к пикселям.java.awt.Graphics2D— контекст для рисования (масштабирование, поворот, наложение).java.awt.image.BufferedImageOp— интерфейс для фильтров (размытие, контраст, цветокоррекция).
Пример 1: Загрузка, изменение размера и сохранение
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ImageResizer {
public static void main(String[] args) throws IOException {
// Загружаем исходное изображение
BufferedImage original = ImageIO.read(new File("input.jpg"));
// Новые размеры (например, уменьшаем до 300x200)
int newWidth = 300;
int newHeight = 200;
// Создаём новое изображение с нужными размерами
BufferedImage resized = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = resized.createGraphics();
// Рисуем исходное изображение с масштабированием
g2d.drawImage(original, 0, 0, newWidth, newHeight, null);
g2d.dispose();
// Сохраняем результат
ImageIO.write(resized, "jpg", new File("output.jpg"));
System.out.println("Готово! Размер изменён.");
}
}
Пример 2: Применение встроенного фильтра (размытие)
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.File;
public class BlurFilter {
public static void main(String[] args) throws Exception {
BufferedImage img = ImageIO.read(new File("input.jpg"));
// Ядро размытия 3x3 (box blur)
float[] blurKernel = {
1f/9f, 1f/9f, 1f/9f,
1f/9f, 1f/9f, 1f/9f,
1f/9f, 1f/9f, 1f/9f
};
Kernel kernel = new Kernel(3, 3, blurKernel);
ConvolveOp convolve = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
BufferedImage blurred = convolve.filter(img, null);
ImageIO.write(blurred, "jpg", new File("blurred.jpg"));
}
}
2. Библиотека ImageJ — для научных и медицинских изображений
ImageJ — это популярный инструмент для обработки изображений, изначально написанный на Java. Он предоставляет сотни готовых плагинов, макросов и мощный API. Отлично подходит для анализа микроскопии, спутниковых снимков и любых задач, где нужна статистика по пикселям.
Подключение (Maven):
<dependency>
<groupId>net.imagej</groupId>
<artifactId>ij</artifactId>
<version>1.53t</version>
</dependency>
Пример: Анализ гистограммы и пороговая обработка
import ij.IJ;
import ij.ImagePlus;
import ij.process.ImageProcessor;
public class ImageJThreshold {
public static void main(String[] args) {
// Открываем изображение
ImagePlus imp = IJ.openImage("microscope.tif");
ImageProcessor ip = imp.getProcessor();
// Преобразуем в градации серого
ip.convertToByte(false);
// Применяем порог (Otsu)
ip.setAutoThreshold("Otsu", true, ImageProcessor.BLACK_AND_WHITE);
// Сохраняем результат
IJ.save(imp, "thresholded.tif");
System.out.println("Пороговая обработка выполнена.");
}
}
ImageJ также умеет работать со стеком изображений (3D/4D),