Создайте изображение RGBA в Stack Overflow

У меня есть матрица значений 640x480x4, то есть 640×480 пикселей каждый с 4 каналами (RGBA). Я хочу создать PNG-файл, который показывает прозрачность. Я пытался использовать OpenCV, но, видимо, прозрачность не поддерживается. Какой самый быстрый и простой способ сделать это, мне просто нужно сохранить несколько изображений?

3

Решение

Как уже говорилось, вы не можете легко написать файл изображения PNG на C ++ без использования внешней библиотеки.

libpng Это наименьшее и наиболее портативное решение, это официальная справочная библиотека PNG, которая используется большинством библиотек изображений для записи и чтения файлов PNG. Это довольно простая в использовании библиотека C, но, возможно, это не лучшее решение для новичка в C ++.

Пример написания PNG-изображения с libpng :

FILE *fp = fopen("file.png", "wb");
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
png_infop info_ptr = png_create_info_struct(png_ptr);
png_init_io(png_ptr, fp);

/* write header */
png_set_IHDR(png_ptr, info_ptr, width, height,
bit_depth, color_type, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);

png_write_info(png_ptr, info_ptr);

/* write bytes */
png_bytep * row_pointers;
<allocate row_pointers and store each row of your image in it>
png_write_image(png_ptr, row_pointers);
png_write_end(png_ptr, NULL);

/* cleanup heap allocation */
for (y=0; y<height; y++) free(row_pointers[y]);
free(row_pointers);

fclose(fp);

Как вы можете видеть, для инициализации контекста написания нужно несколько строк, и я добровольно удалил управление ошибками, которое немного сложно libpng (использование setjmp как пример) и определенно не подходит для начинающего программиста Си.

Вы можете взглянуть на библиотеку изображений более высокого уровня, такую ​​как ImageMagick который имеет C ++ API под названием Magick++, Вот пример записи изображения в памяти в файл PNG:

Magick::Blob blob(data, length);
Magick::Image image;
image.size("640x480")
image.magick("RGBA");
image.read(blob);
image.write("file.png");

Как видите, с библиотекой более высокого уровня это намного проще.

5

Другие решения

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

Вам нужно использовать какую-то библиотеку. Я не использовал его напрямую, но код, который я скомпилировал на моей машине, часто использует Libpng

3

По вопросам рекламы [email protected]