Из PNG в файлы Portable Any Map и Farbfeld на D

Из PNG в файлы Portable Any Map и Farbfeld на D

Вы когда-нибудь задумывались, как можно преобразовать изображение в другой формат, используя язык программирования? Сегодня мы рассмотрим, как конвертировать изображения в формате PNG в файлы Portable Any Map (PAM) и Farbfeld, используя язык программирования D. Эта статья поможет вам понять основы работы с изображениями и научит вас использовать возможности D для выполнения этой задачи.

Что такое PNG, PAM и Farbfeld?

PNG (Portable Network Graphics)

PNG — это растровый формат изображений, который поддерживает сжатие без потерь. Это означает, что качество изображения не ухудшается при сохранении, что делает его отличным выбором для графики с прозрачностью и сложными цветами.

PAM (Portable Any Map)

PAM — это универсальный формат изображения, который поддерживает несколько подтипов (PBM, PGM, PPM и PFM). Он используется в программах обработки изображений для простоты и гибкости.

Farbfeld

Farbfeld — это простой и минималистичный формат изображения, который разработан для легкости в обработке. Он фиксирует каждую точку изображения в формате RGBA с фиксированной глубиной цвета в 16 бит на канал.

Начнем с основ: Установка D и библиотек

Установка компилятора D

Для работы с языком D вам понадобится компилятор. Один из самых популярных компиляторов — это DMD (Digital Mars D). Вы можете установить его, следуя инструкциям на официальном сайте D Language.

# Для Windows
choco install dmd

# Для macOS
brew install dmd

# Для Linux (Debian/Ubuntu)
sudo apt-get install dmd-compiler

Установка необходимых библиотек

Для работы с PNG, PAM и Farbfeld нам понадобятся несколько библиотек. D имеет пакетный менеджер Dub, который облегчит установку необходимых пакетов.

Создайте новый проект D:

dub init png-to-pam-farbfeld
cd png-to-pam-farbfeld

Добавьте зависимости в файл dub.json:

"dependencies": {
    "imageformats": "~>6.2.0"
}

Установите зависимости:

dub add imageformats

Конвертация PNG в PAM

Чтение PNG файла

Первым шагом будет чтение PNG файла. Для этого мы воспользуемся библиотекой imageformats.

import std.stdio;
import std.file;
import imageformats;

void main() {
    auto image = readPNG("input.png");
    writeln("PNG image loaded successfully.");
}

Запись в PAM файл

Теперь, когда у нас есть изображение в формате PNG, мы можем преобразовать его в PAM и сохранить.

void saveAsPAM(Image image, string filename) {
    auto file = File(filename, "w");
    file.write("P7\n");
    file.writef("WIDTH %d\n", image.width);
    file.writef("HEIGHT %d\n", image.height);
    file.write("DEPTH 4\n");
    file.write("MAXVAL 255\n");
    file.write("TUPLTYPE RGB_ALPHA\n");
    file.write("ENDHDR\n");

    foreach (y; 0 .. image.height) {
        foreach (x; 0 .. image.width) {
            auto pixel = image.getPixel(x, y);
            file.rawWrite([cast(ubyte) pixel.r, cast(ubyte) pixel.g, cast(ubyte) pixel.b, cast(ubyte) pixel.a]);
        }
    }

    file.close();
    writeln("PAM file saved successfully.");
}

void main() {
    auto image = readPNG("input.png");
    saveAsPAM(image, "output.pam");
}

Объяснение кода

  • Мы читаем PNG файл с помощью функции readPNG.
  • Создаем новый файл для записи данных в формате PAM.
  • Записываем заголовок PAM файла, включая ширину, высоту, глубину, максимальное значение цвета и тип данных.
  • Проходим по каждому пикселю изображения и записываем его компоненты (R, G, B, A) в файл.
  • Закрываем файл и выводим сообщение о успешном сохранении.

Конвертация PNG в Farbfeld

Чтение PNG файла

Процесс чтения PNG файла остаётся тем же, как и в предыдущем примере.

import std.stdio;
import std.file;
import imageformats;

void main() {
    auto image = readPNG("input.png");
    writeln("PNG image loaded successfully.");
}

Запись в Farbfeld файл

Теперь мы можем преобразовать изображение в Farbfeld и сохранить его.

void saveAsFarbfeld(Image image, string filename) {
    auto file = File(filename, "w");
    file.rawWrite("farbfeld".representation);

    file.rawWrite([
        cast(ubyte) (image.width >> 24), cast(ubyte) (image.width >> 16), cast(ubyte) (image.width >> 8), cast(ubyte) image.width,
        cast(ubyte) (image.height >> 24), cast(ubyte) (image.height >> 16), cast(ubyte) (image.height >> 8), cast(ubyte) image.height
    ]);

    foreach (y; 0 .. image.height) {
        foreach (x; 0 .. image.width) {
            auto pixel = image.getPixel(x, y);
            file.rawWrite([
                cast(ubyte) (pixel.r >> 8), cast(ubyte) pixel.r,
                cast(ubyte) (pixel.g >> 8), cast(ubyte) pixel.g,
                cast(ubyte) (pixel.b >> 8), cast(ubyte) pixel.b,
                cast(ubyte) (pixel.a >> 8), cast(ubyte) pixel.a
            ]);
        }
    }

    file.close();
    writeln("Farbfeld file saved successfully.");
}

void main() {
    auto image = readPNG("input.png");
    saveAsFarbfeld(image, "output.ff");
}

Объяснение кода

  • Создаем новый файл для записи данных в формате Farbfeld.
  • Записываем заголовок «farbfeld» и размеры изображения (ширина и высота) в 32-битном формате.
  • Проходим по каждому пикселю изображения и записываем его компоненты (R, G, B, A) в файл, конвертируя их в 16-битный формат.
  • Закрываем файл и выводим сообщение о успешном сохранении.

Мы рассмотрели, как конвертировать изображения из формата PNG в PAM и Farbfeld с использованием языка программирования D. Это полезный навык, который может пригодиться в различных проектах, связанных с обработкой изображений. Примеры, представленные в статье, показывают, как легко и эффективно можно выполнять эти задачи с помощью D и соответствующих библиотек.


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

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

Обновлено:

24.05.2024


Комментарии

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

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