StdPicture

Скачать StdPicture.java
Скачать Picture.java

StdPicture - библиотека для работы с пикселями изображения в моделях RGB и ARGB.


Класс StdPicture предоставляет статические методы для изменения отдельных пикселей изображения в цветовой модели RGB. Можно либо создать пустое изображение заданного размера, либо прочитать изображение из поддерживаемого формата файла (обычно JPEG, PNG, GIF, TIFF, BMP). Также есть методы для показа изображения в окне и сохранения в файл.

Использование в курсе.

Класс StdPicture предназначен для раннего этапа курса, до изучения объектов. Класс Picture — объектно-ориентированная версия, которая позволяет работать с несколькими изображениями одновременно.

Начало работы.

Чтобы использовать этот класс, у вас должны быть StdPicture.java и Picture.java: StdPicture зависит от Picture. Скачайте StdPicture.java и Picture.java, затем поместите их в рабочую директорию проекта.

Теперь скопируйте в редактор следующую короткую программу:

public class TestStdPicture {
    public static void main(String[] args) {
        StdPicture.read("https://book.learncs.ru/books/programming/java-projects/images/mandrill.jpg");
        StdPicture.show();
    }
}

Если скомпилировать и запустить программу, должно появиться изображение мандрила в отдельном окне.

Устройство изображения.

Изображение — это сетка пикселей (pixel) размера width x height; пиксель (0, 0) расположен в левом верхнем углу. pixel (col, row) — пиксель с координатами столбца col и строки row. Цвет пикселя задается моделью RGB: уровни красного (R), зеленого (G) и синего (B) — целые числа от 0 до 255.

Инициализация изображения.

Для инициализации используются методы:

  • read(String filename)
  • init(int width, int height)

Первый метод читает изображение из файла поддерживаемого формата (обычно JPEG, PNG, GIF, TIFF, BMP) и инициализирует текущее изображение этими данными. Второй метод создает изображение размера width x height, где каждый пиксель изначально черный.

Получение и изменение цветов отдельных пикселей.

Методы для чтения RGB-компонент пикселя:

  • getRed(int col, int row)
  • getGreen(int col, int row)
  • getBlue(int col, int row)
  • setRGB(int col, int row, int r, int g, int b)

Первые три метода возвращают красную, зеленую и синюю компоненты пикселя (col, row). Каждая компонента — целое число от 0 до 255, где 0 означает отсутствие компоненты, а 255 — максимальную интенсивность. Последний метод устанавливает компоненты r, g, b для пикселя (col, row).

Обход всех пикселей.

Типичная операция обработки изображений — пройти по всем пикселям. Ниже пример перевода цветного изображения в оттенки серого по формуле NTSC:

\[ Y = 0.299 \times r + 0.587 \times g + 0.114 \times b \]

Если r, g, b равны, цвет является оттенком серого.

StdPicture.read("https://book.learncs.ru/books/programming/java-projects/images/mandrill.jpg");
for (int col = 0; col < StdPicture.width(); col++) {
    for (int row = 0; row < StdPicture.height(); row++) {
        int r = StdPicture.getRed(col, row);
        int g = StdPicture.getGreen(col, row);
        int b = StdPicture.getBlue(col, row);
        int y = (int) (Math.round(0.299*r + 0.587*g + 0.114*b));
        StdPicture.setRGB(col, row, y, y, y);
    }
}
StdPicture.show();

На рисунке показан результат работы кода: цветное изображение переведено в оттенки серого, и каждый пиксель имеет одинаковые значения R, G и B (равные y).

Прозрачность.

Класс StdPicture поддерживает прозрачные изображения через модель ARGB. Полезные методы:

  • getAlpha(int col, int row)
  • setARGB(int col, int row, int a, int r, int g, int b)

Первый метод возвращает альфа-компоненту пикселя (col, row). Второй задает альфа-, красную, зеленую и синюю компоненты этого пикселя. Значение альфа-канала определяет прозрачность: 0 — полностью прозрачный, 255 — полностью непрозрачный. Если прозрачность явно не задавать, используется значение 255.

Сохранение файлов.

StdPicture поддерживает запись изображения в поддерживаемые форматы (обычно JPEG, PNG, GIF, TIFF, BMP).

  • save(String filename)

Изображение также можно сохранить вручную через меню окна: File -> Save.

Форматы файлов.

StdPicture поддерживает чтение и запись всех форматов, которые поддерживает javax.imageio (обычно JPEG, PNG, GIF, TIFF, BMP). Соответствующие расширения: .jpg, .png, .gif, .tif, .bmp. Форматы JPEG и BMP не поддерживают прозрачность.

Использование памяти.

Изображение размера \(W \times H\) использует примерно \(4 \times W \times H\) байт памяти, так как цвет каждого пикселя кодируется 32-битным int.

Полное API StdPicture на английском


По материалам:
Robert Sedgewick, Kevin Wayne. Computer Science: An Interdisciplinary Approach. Princeton University.