Обработка изображений в Java: библиотеки, инструменты и примеры кода

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

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

Начать курс

Работа с изображениями в Java: библиотеки, инструменты и примеры кода

Java предоставляет мощные встроенные средства для работы с графикой, а также богатую экосистему сторонних библиотек. В этой статье мы рассмотрим основные способы загрузки, обработки, преобразования и сохранения изображений на Java — от стандартных классов javax.imageio и java.awt до популярных библиотек, упрощающих жизнь разработчику.

1. Стандартные средства: javax.imageio и java.awt.image

Базовая работа с растровыми изображениями в Java строится на пакете javax.imageio (загрузка/сохранение) и java.awt.image (работа с пикселями). Основной класс — BufferedImage, который хранит изображение в оперативной памяти.

Загрузка и сохранение изображения

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ImageExample {
    public static void main(String[] args) throws IOException {
        // Загрузка изображения из файла
        BufferedImage image = ImageIO.read(new File("input.jpg"));
        System.out.println("Ширина: " + image.getWidth() + ", Высота: " + image.getHeight());

        // Сохранение в другом формате
        ImageIO.write(image, "png", new File("output.png"));
    }
}

ImageIO поддерживает форматы: JPEG, PNG, BMP, WBMP, GIF (только чтение). Для расширения списка форматов используйте плагины ImageIO (например, TwelveMonkeys).

Изменение размера (ручной способ)

import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;

public static BufferedImage resize(BufferedImage original, int newWidth, int newHeight) {
    BufferedImage resized = new BufferedImage(newWidth, newHeight, original.getType());
    Graphics2D g2d = resized.createGraphics();
    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g2d.drawImage(original, 0, 0, newWidth, newHeight, null);
    g2d.dispose();
    return resized;
}

2. Java 2D API: рисование и фильтры

Класс Graphics2D позволяет не только масштабировать, но и накладывать эффекты, поворачивать, обрезать изображения, добавлять текст и геометрические фигуры.

Наложение водяного знака

public static BufferedImage addWatermark(BufferedImage source, String text) {
    BufferedImage result = new BufferedImage(source.getWidth(), source.getHeight(), source.getType());
    Graphics2D g2d = result.createGraphics();
    g2d.drawImage(source, 0, 0, null);
    g2d.setColor(new Color(255, 255, 255, 128));
    g2d.setFont(new Font("Arial", Font.BOLD, 40));
    g2d.drawString(text, 20, source.getHeight() - 20);
    g2d.dispose();
    return result;
}

Применение цветового фильтра (сепия)

public static BufferedImage applySepia(BufferedImage img) {
    int width = img.getWidth();
    int height = img.getHeight();
    BufferedImage sepia = new BufferedImage(width, height, img.getType());

    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            int rgb = img.getRGB(x, y);
            int r = (rgb >> 16) & 0xFF;
            int g = (rgb >> 8) & 0xFF;
            int b = rgb & 0xFF;

            int newR = (int) (0.393 * r + 0.769 * g + 0.189 * b);
            int newG = (int) (0.349 * r + 0.686 * g + 0.168 * b);
            int newB = (int) (0.272 * r + 0.534 * g + 0.131 * b);

            newR = Math.min(255, newR);
            newG = Math.min(255, newG);
            newB = Math.min(255, newB);

            int newPixel = (0xFF << 24) | (newR << 16) | (newG << 8) | newB;
            sepia.setRGB(x, y, newPixel);
        }
    }
    return sepia;
}

3. Thumbnailator — простая генерация миниатюр

Библиотека Thumbnailator (Maven: net.coobird:thumbnailator:0.4.20) позволяет изменять размер, обрезать, поворачивать и водяные знаки в одну строку кода.

import net.coobird.thumbnailator.Thumbnails;

public static void createThumbnail(String input, String output, int width, int height) throws IOException {
    Thumbnails.of(input)
            .size(width, height)
            .keepAspectRatio(true)
            .outputFormat("jpg")
            .toFile(output);                    

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