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, записать это, а затем фактические данные пикселей.
Я не использовал 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");
}