У меня есть матрица значений 640x480x4, то есть 640×480 пикселей каждый с 4 каналами (RGBA). Я хочу создать PNG-файл, который показывает прозрачность. Я пытался использовать OpenCV, но, видимо, прозрачность не поддерживается. Какой самый быстрый и простой способ сделать это, мне просто нужно сохранить несколько изображений?
Как уже говорилось, вы не можете легко написать файл изображения 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");
Как видите, с библиотекой более высокого уровня это намного проще.
Помимо изображений BMP, все распространенные форматы изображений довольно сложны, и вы действительно не можете просто написать несколько строк кода и получить то, что вы хотите. Все они имеют ряд элементов (заголовок, нижний колонтитул и т. Д.) И, как правило, сжатие в основных разделах изображения.
Вам нужно использовать какую-то библиотеку. Я не использовал его напрямую, но код, который я скомпилировал на моей машине, часто использует Libpng