C++: Какой самый простой способ чтения и записи файлов BMP с использованием C++ в Windows?

Я хотел бы загрузить файл BMP, выполнить некоторые операции с ним в памяти и вывести новый файл BMP, используя C++ в Windows (Win32 native). Мне известно о ImageMagick и его привязке к C++ Magick ++, но я думаю, что это излишнее решение для этого проекта, поскольку в настоящее время меня не интересуют другие форматы файлов или платформы.

Каким будет самый простой способ настройки кода для чтения и записи файлов BMP? Ответ может быть "просто используйте Magick++, это самое простое".

Смежный вопрос: Какая библиотека изображений лучше всего работает?

7 ответов

Решение

При разработке только для Windows я обычно просто использую класс ATL CImage

EasyBMP, если вы хотите просто поддержку BMP. Это достаточно просто, чтобы начать использовать в течение нескольких минут, и это мультиплатформенный, если вам это нужно.

Файл BMP состоит из 3 структур. BITMAPFILEHEADER, за которым следует BITMAPINFO, за которым следует массив байтов.

Абсолютно самый простой способ загрузить файл BMP с помощью Win32 - вызвать CreateFile, GetFileSize, ReadFile и CloseHandle, чтобы загрузить изображение файла в память, а затем просто навести указатель на буфер на BITMAPFILEHEADER и перейти оттуда.

Я лгу, более простой способ - вызвать LoadImage. Убедитесь, что передан флаг LR_DIBSECTION, чтобы гарантировать, что GDI не преобразует загруженное изображение в ту битовую глубину, на которую настроен ваш основной дисплей. Это дает вам преимущество, заключающееся в том, что вы получаете HBITMAP, который вы можете выбрать в DC и, следовательно, рисовать с помощью GDI.

Чтобы сохранить его, однако, нет ярлыка. Вам нужно подготовить BITMAPFILEHEADER, выписать его, заполнить структуру BITMAPINFO, записать это, а затем фактические данные пикселей.

Я старался CImage как выше, но у меня был массив C, полный значений пикселей, которые я просто хотел вывести как BMP (или любой другой формат). CImage не имеет конструктора для этого, и я не хотел связывать MFC (для CBitmap) и не пытайтесь понять IWIC.

То, что было легко, было CImg:

#include <cimg/cimg.h>
using namespace cimg_library;
//...
void SaveMyData(uint8_t *pxarray, int width, int height)
{
    CImg<uint8_t> img(pxarray, width, height);
    img.save_bmp("sav.bmp");
}

Класс CBitmap выполняет ввод-вывод BMP.

#include <windows.h>

LoadImage

Я не использовал Magick++, но в Windows есть библиотека под названием Windows Imaging Component, которая, вероятно, подойдет вам.

Другие вопросы по тегам