C++: What's the simplest way to read and write BMP files using C++ on Windows?
Asked Answered
M

7

11

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?

Memnon answered 13/10, 2008 at 23:21 Comment(1)
The Related Question was removed by moderation.Besides
S
8

When developing just for Windows I usually just use the ATL CImage class

Salespeople answered 13/10, 2008 at 23:31 Comment(4)
I think CImage is part of the shared MFC/ATL classes - which may be a bit easier to include then the CBitmap class, which requires MFC.Beltz
Yes, you just need to include atlimage.hSalespeople
what if you're not targeting only windows?Pentothal
I have a custom bitmap class that I use when I am developing apps for other platforms or where I need more flexibility. The BMP format is relatively simple. There is also an open source library (BSD license) called EasyBMP on SourceForge if you need something cross-platform.Salespeople
R
7

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.

Randolph answered 16/8, 2011 at 12:29 Comment(0)
B
5

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.

Booker answered 14/10, 2008 at 7:30 Comment(0)
E
3

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");
}
Erythrism answered 14/8, 2012 at 22:36 Comment(1)
I should mention: I don't think I'd use CImg in a product. I don't like the monolithic header, nor that it throws a lot of warnings.Erythrism
J
2

The CBitmap class does BMP I/O.

Johnathanjohnathon answered 13/10, 2008 at 23:28 Comment(0)
A
2
#include <windows.h>

LoadImage

Arena answered 14/10, 2008 at 5:47 Comment(0)
L
1

I've not used Magick++, but Windows has a library called the Windows Imaging Component which would likely suit your needs.

Lattermost answered 13/10, 2008 at 23:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.