Reputation: 95614
I would like to load a BMP file, do some operations on it in memory, and output a new BMP file using C++ on Windows (Win32 native). I am aware of ImageMagick and it's C++ binding Magick++, but I think it's an overkill for this project since I am currently not interested in other file formats or platforms.
What would be the simplest way in terms of code setup to read and write BMP files? The answer may be "just use Magick++, it's the simplest."
Related Question: What is the best image manipulation library?
Upvotes: 11
Views: 44242
Reputation: 1238
I tried CImage
as above, but I had a C array full of pixel values that I simply wanted to dump as a BMP (or any other format). CImage
has no constructor for that, and I did not want to link MFC (for CBitmap
) nor try to fathom IWIC.
What was easy was 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");
}
Upvotes: 3
Reputation: 2295
EasyBMP if you want just bmp support. I'ts simple enough to start using within minutes, and it's multiplatform if you would need that.
Upvotes: 7
Reputation: 36026
A BMP file consists of 3 structures. A BITMAPFILEHEADER followed by a BITMAPINFO followed by an array of bytes.
The absolute simplest way to load a BMP file using Win32 is to call CreateFile, GetFileSize, ReadFile and CloseHandle to load the file image into memory, and then just cast a pointer to the buffer to a BITMAPFILEHEADER and go from there.
I lie, a simpler way is to call LoadImage. Making sure to pass the LR_DIBSECTION flag to ensure that GDI doesnt convert the loaded image into whatever bitdepth your primary display is configured to. This has the advantage of getting you a HBITMAP that you can select into a DC and therefore draw all over using GDI.
To save it however, there is no shortcut. You need to prepare a BITMAPFILEHEADER, write it out, fill in a BITMAPINFO struct, write that out, and then the actual pixel data.
Upvotes: 5
Reputation: 23479
When developing just for Windows I usually just use the ATL CImage class
Upvotes: 8
Reputation: 1397
I've not used Magick++, but Windows has a library called the Windows Imaging Component which would likely suit your needs.
Upvotes: 1