Работа с изображениями в Java: от чтения до обработки

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с изображениями в 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,                    

Рекомендаций