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

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

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

Вопрос: какова Лучшая библиотека обработки изображений?

7 ответов


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


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


файл BMP состоит из 3 структур. После BITMAPFILEHEADER на BITMAPINFO последующим массив байтов.

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

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

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


на CBitmap класс делает bmp I / O.


#include <windows.h>

LoadImage


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


пробовал CImage как и выше, но у меня был массив C, полный значений пикселей, которые я просто хотел сбросить как BMP (или любой другой формат). CImage не имеет конструктора для этого, и я не хотел связывать MFC (for 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");
}