Битовые плоскости в изображениях на языке D

Битовые плоскости в изображениях на языке D

Изображение в цифровом формате представляет собой массив пикселей, где каждый пиксель содержит информацию о цвете. Эта информация хранится в различных форматах, но наиболее распространённым является формат RGB, где цвет каждого пикселя определяется тремя компонентами: красной (Red), зелёной (Green) и синей (Blue). В данной статье мы рассмотрим, как работать с изображениями на языке программирования D, выделяя отдельные цветовые каналы и битовые плоскости.

Цветовые каналы (RGB)

Каждый пиксель изображения в формате RGB состоит из трёх компонент: красной, зелёной и синей, каждая из которых обычно представлена 8-битным значением (от 0 до 255). Эти значения определяют интенсивность соответствующего цвета в данном пикселе. Совмещая три канала, мы получаем полный цвет изображения.

Пример кода: Выделение цветового канала

Для работы с изображениями в языке программирования D, можно использовать библиотеку imageformats. Рассмотрим пример кода, который выделяет отдельный цветовой канал из изобаржения.

import std.stdio;
import imageformats;

void extractColorChannel(string inputFilePath, string outputFilePath, int channel) {
    auto img = load(inputFilePath);
    auto width = img.width;
    auto height = img.height;

    // Создаем новое изображение для выделенного канала
    auto newImg = Image(width, height, img.format);

    foreach(y; 0 .. height) {
        foreach(x; 0 .. width) {
            // Получаем текущий пиксель
            auto pixel = img.pixel(x, y);

            // Зануляем остальные каналы
            if (channel == 0) { // Красный канал
                newImg.pixel(x, y) = Color(pixel.r, 0, 0, pixel.a);
            } else if (channel == 1) { // Зеленый канал
                newImg.pixel(x, y) = Color(0, pixel.g, 0, pixel.a);
            } else if (channel == 2) { // Синий канал
                newImg.pixel(x, y) = Color(0, 0, pixel.b, pixel.a);
            }
        }
    }

    // Сохраняем новое изображение
    save(newImg, outputFilePath);
}

void main() {
    extractColorChannel("input.png", "output_red.png", 0); // Красный канал
    extractColorChannel("input.png", "output_green.png", 1); // Зеленый канал
    extractColorChannel("input.png", "output_blue.png", 2); // Синий канал
}

Этот код загружает изображение, создает новое изображение, в котором сохраняется только один из цветовых каналов, и сохраняет его на диск.

Битовые плоскости

Битовые плоскости — это метод представления изображения, при котором каждый бит определенного цветового канала рассматривается отдельно. Например, 8-битное значение цвета можно представить как восемь отдельных плоскостей, каждая из которых содержит один бит всех пикселей этого канала.

Пример кода: Выделение битовой плоскости

Теперь рассмотрим код, который выделяет битовую плоскость из указанного цветового канаал изображения.

import std.stdio;
import imageformats;

void extractBitPlane(string inputFilePath, string outputFilePath, int channel, int bitPlane) {
    auto img = load(inputFilePath);
    auto width = img.width;
    auto height = img.height;

    // Создаем новое изображение для битовой плоскости
    auto newImg = Image(width, height, img.format);

    foreach(y; 0 .. height) {
        foreach(x; 0 .. width) {
            // Получаем текущий пиксель
            auto pixel = img.pixel(x, y);

            ubyte value;
            if (channel == 0) { // Красный канал
                value = (pixel.r >> bitPlane) & 1;
            } else if (channel == 1) { // Зеленый канал
                value = (pixel.g >> bitPlane) & 1;
            } else if (channel == 2) { // Синий канал
                value = (pixel.b >> bitPlane) & 1;
            }

            // Устанавливаем значение битовой плоскости в новый пиксель
            newImg.pixel(x, y) = Color(value * 255, value * 255, value * 255, pixel.a);
        }
    }

    // Сохраняем новое изображение
    save(newImg, outputFilePath);
}

void main() {
    extractBitPlane("input.png", "output_bitplane_0.png", 0, 0); // Красный канал, 0-я битовая плоскость
    extractBitPlane("input.png", "output_bitplane_1.png", 0, 1); // Красный канал, 1-я битовая плоскость
}

В этом примере кода мы выделяем отдельную битовую плоскость из цветового канала изображения и сохраняем её как новое изображение.


Карпов Ярослав

Автор статьи:

Обновлено:

31.05.2024


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *