Работа с изображениями в Java: библиотеки и практические примеры
Java предоставляет мощные встроенные инструменты для работы с растровыми изображениями. В этой статье мы рассмотрим стандартную библиотеку javax.imageio, пакет java.awt.image и популярную стороннюю библиотеку Thumbnailator. Вы узнаете, как читать, сохранять, масштабировать, применять фильтры и конвертировать форматы изображений.
1. Основы: пакет javax.imageio и BufferedImage
Ключевой класс для представления изображения в памяти — BufferedImage. Он позволяет получать и изменять пиксели, работать с различными цветовыми моделями (RGB, ARGB) и типами данных.
Чтение изображения из файла
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ImageReadExample {
public static void main(String[] args) {
try {
File inputFile = new File("input.jpg");
BufferedImage image = ImageIO.read(inputFile);
System.out.println("Ширина: " + image.getWidth());
System.out.println("Высота: " + image.getHeight());
System.out.println("Тип: " + image.getType());
} catch (IOException e) {
e.printStackTrace();
}
}
}
Запись изображения в файл
File outputFile = new File("output.png");
ImageIO.write(image, "png", outputFile); // Формат определяется по расширению
Поддерживаемые форматы: JPEG, PNG, BMP, WBMP, GIF (только чтение). Полный список можно получить через ImageIO.getReaderFormatNames().
2. Масштабирование и трансформации с Java 2D
Пакет java.awt.Graphics2D позволяет выполнять качественное масштабирование, поворот, отражение и наложение изображений.
Масштабирование с сохранением пропорций
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
public class ImageResizer {
public static BufferedImage resize(BufferedImage original, int targetWidth, int targetHeight) {
BufferedImage resized = new BufferedImage(targetWidth, targetHeight, original.getType());
Graphics2D g2d = resized.createGraphics();
// Включаем сглаживание для лучшего качества
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.drawImage(original, 0, 0, targetWidth, targetHeight, null);
g2d.dispose();
return resized;
}
}
Поворот изображения на 90 градусов
public static BufferedImage rotate(BufferedImage image, double angleDegrees) {
double radians = Math.toRadians(angleDegrees);
int w = image.getWidth();
int h = image.getHeight();
// Новый размер после поворота
int newW = (int) Math.abs(w * Math.cos(radians)) + (int) Math.abs(h * Math.sin(radians));
int newH = (int) Math.abs(h * Math.cos(radians)) + (int) Math.abs(w * Math.sin(radians));
BufferedImage rotated = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = rotated.createGraphics();
g2d.translate((newW - w) / 2.0, (newH - h) / 2.0);
g2d.rotate(radians, w / 2.0, h / 2.0);
g2d.drawImage(image, 0, 0, null);
g2d.dispose();
return rotated;
}
3. Применение фильтров: размытие, контраст, яркость
Для фильтрации используйте BufferedImageOp (из пакета java.awt.image). Наиболее полезные реализации:
ConvolveOp— для размытия, резкости, тиснения через ядро свёрткиColorConvertOp— преобразование цветовых пространствLookupOp— коррекция яркости/контраста через таблицу
Пример размытия (Blur) с ядром 3×3
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
public static BufferedImage blur(BufferedImage image) {
float[] blurKernel = {
1f / 9f, 1f / 9f, 1f / 9f,
1f / 9f, 1f / 9f, 1f / 9f,
1f / 9f, 1f / 9f,