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

StackOverflow https://stackoverflow.com/questions/199403

Вопрос

Я хотел бы загрузить файл 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>

LoadImage

Я не использовал 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");
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top