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

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

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

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

Ответы [ 7 ]

7 голосов
/ 14 октября 2008

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

6 голосов
/ 16 августа 2011

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

5 голосов
/ 14 октября 2008

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

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

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

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

2 голосов
/ 14 октября 2008
#include <windows.h>

LoadImage

2 голосов
/ 14 октября 2008

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

1 голос
/ 15 августа 2012

Я попытался 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");
}
1 голос
/ 14 октября 2008

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

...