C ++: Какой самый простой способ чтения и записи файлов BMP с использованием C ++ в Windows?
-
11-07-2019 - |
Вопрос
Я хотел бы загрузить файл BMP, выполнить некоторые операции с ним в памяти и вывести новый файл BMP с помощью C ++ в Windows (родной Win32). Мне известно о ImageMagick и его привязке к C ++ Magick ++ , но я считаю, что это излишнее решение для этого проекта, поскольку в настоящее время меня не интересуют другие форматы файлов или платформы.
Какой самый простой способ настройки кода для чтения и записи файлов BMP? Ответ может быть следующим: просто используйте Magick ++, это самый простой вариант.
Смежный вопрос: Что такое лучшая библиотека для работы с изображениями? р>
Решение
При разработке для Windows я обычно использую ATL CImage class
Другие советы
EasyBMP , если вам нужна только поддержка bmp. Это достаточно просто, чтобы начать использовать в течение нескольких минут, и это мультиплатформенный, если вам это нужно. Р>
Файл BMP состоит из 3 структур. BITMAPFILEHEADER, за которым следует BITMAPINFO, за которым следует массив байтов.
Абсолютно самый простой способ загрузить файл BMP с помощью Win32 - вызвать CreateFile, GetFileSize, ReadFile и CloseHandle, чтобы загрузить изображение файла в память, а затем просто привести указатель на буфер к BITMAPFILEHEADER и перейти оттуда. р>
Я лгу, более простой способ - вызвать LoadImage. Убедитесь, что передан флаг LR_DIBSECTION, чтобы гарантировать, что GDI не преобразует загруженное изображение в ту битовую глубину, на которую настроен ваш основной дисплей. Это дает вам преимущество, заключающееся в том, что вы получаете HBITMAP, который вы можете выбрать в DC и, следовательно, рисовать с помощью GDI.
Однако, чтобы сохранить его, ярлыка нет. Вам необходимо подготовить BITMAPFILEHEADER, записать его, заполнить структуру BITMAPINFO, записать ее, а затем фактические данные пикселей.
класс CBitmap выполняет BMP I / вывода. Р>
#include <windows.h>
Я не использовал Magick ++, но в Windows есть библиотека под названием Windows Imaging Component, которая, вероятно, подойдет вам.
Я пробовал 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");
}