Компьютерная графика → Работа с изображениями в Java: чтение, запись, изменение

Так, как основным языком в этом курсе стал язык Java. Покажу пример того как работать с файлами изображений в Java, чтобы вам не пришлось долго искать как это делать. Для других языков руководства можно найти в Интернете. 

Того, что здесь будет показано вполне достаточно чтобы выполнить все лабы. 

Итак, поехали. 

BufferedImage - класс который представляет изображение, которое хранится в памяти. С помощью этого класса мы будем обрабатывать изображения.

Класс импортируется с пакета java.awt.image:

import java.awt.image.BufferedImage;

Для открытия изображения будем использовать два класса: File, ImageIO:

import javax.imageio.ImageIO;
import java.io.File;
File file = new File("путь до файла");
BufferedImage image = ImageIO.read(file);

В параметра конструктора класса File, мы должны указать путь до файла. Путь может быть абсолютным, либо относитьтельно корня проекта. Можно открывать картинки с расширением jpg, png, bmp.

После этого в объекта image у нас будет храниться вся картинка, которую мы открыли. Мы можем получить у этой картинки значение любого пикселя в виде цвета в RGB. Чтобы получить цвет какого либо пикселя нам нужен класс Color:

import java.awt.Color;

Чтобы получить цвет из пикселя с координатами [20, 20] нужно написать:

Color color = new Color(image.getRGB(20, 20));

int blue = color.getBlue();
int red = color.getRed();
int green = color.getGreen();

Тут также показано как получить значение каждого канала(красный, зеленый, синий) этого цвета. Значения каналов находятся в диапазоне [0, 255].

Значения этих каналов мы будем использовать для обработки изображений. После обработки мы обычно получаем новые значения для каждого канала. Чтобы объединить три канала в один цвет, создаем новый объект класса Color:

Color newColor = new Color(newRed, newGreen, newBlue);

Затем, мы можем установить этот цвет как цвет какого-либо пикселя в изображение:

image.setRGB(x, y, newColor.getRGB());

После того, как мы обработали изображение, его нужно сохранить обратно в файл:

File output = new File("путь до нового файла");
ImageIO.write(image, "jpg", output);

Вместо "jpg" можно использовать также "png" или "bmp".

Давайте для примера я напишу приложение, которое будет превращать исходное изображение в черно-белое, используя то, что написано в статье. 

Обычно для результирующего изображения создается новый объект типа BufferedImage такого же размера и типа, как исходное изображение:

BufferedImage result = new BufferedImage(image.getWidth(), image.getHeight(), image.getType());

Преобразователь в черное белое

Возьмем для примера любое цветное изображение. Например: 

Поместим его в корень проекта. 

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

public class ImageProcessor {
    public static void main(String[] args) {
        try {

            // Открываем изображение
            File file = new File("katana.jpg");
            BufferedImage source = ImageIO.read(file);

            // Создаем новое пустое изображение, такого же размера
            BufferedImage result = new BufferedImage(source.getWidth(), source.getHeight(), source.getType());

            // Делаем двойной цикл, чтобы обработать каждый пиксель
            for (int x = 0; x < source.getWidth(); x++) {
                for (int y = 0; y < source.getHeight(); y++) {

                    // Получаем цвет текущего пикселя
                    Color color = new Color(source.getRGB(x, y));

                    // Получаем каналы этого цвета
                    int blue = color.getBlue();
                    int red = color.getRed();
                    int green = color.getGreen();

                    // Применяем стандартный алгоритм для получения черно-белого изображения
                    int grey = (int) (red * 0.299 + green * 0.587 + blue * 0.114);

                    // Если вы понаблюдаете, то заметите что у любого оттенка серого цвета, все каналы имеют
                    // одно и то же значение. Так, как у нас изображение тоже будет состоять из оттенков серого
                    // то, все канали будут иметь одно и то же значение.
                    int newRed = grey;
                    int newGreen = grey;
                    int newBlue = grey;

                    //  Cоздаем новый цвет
                    Color newColor = new Color(newRed, newGreen, newBlue);

                    // И устанавливаем этот цвет в текущий пиксель результирующего изображения
                    result.setRGB(x, y, newColor.getRGB());
                }
            }

            // Созраняем результат в новый файл
            File output = new File("katana_grey.jpg");
            ImageIO.write(result, "jpg", output);

        } catch (IOException e) {

            // При открытии и сохранении файлов, может произойти неожиданный случай.
            // И на этот случай у нас try catch
            System.out.println("Файл не найден или не удалось сохранить");
        }
    }
}

Запустив эту программу мы получим новую картинку в той же папке где и исходная картинка. И она должна быть такой:

10558 0
Alisher Alikulov