Компьютерная графика → Работа с изображениями в 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("Файл не найден или не удалось сохранить");
}
}
}
Запустив эту программу мы получим новую картинку в той же папке где и исходная картинка. И она должна быть такой: