What a coincidence? I found that all the libraries found are very huge and have a high level of abstraction, which cannot meet the needs. I just wrote a C++ class for reading and writing bmp, which supports 8-bit grayscale images and 24-bit RGB images.
https://github.com/edimetia3d/simpleBMP
The code is very short. In fact, you can understand what is done by looking at the source code for 10 minutes.
A brief explanation: There is no abstraction. Reading is to map all the data in the bmp (yes, every byte is used) to a defined variable. Saving means writing these variables back to disk.
In fact, I originally planned to write it completely in C. I am not too interested in dynamic memory, so I used vector For the read and write part, I still use fread fwrite. If the vector part is replaced by dynamic memory, it can be used in C Running below. For the meaning of each variable, see http://www.cnblogs.com/xiekeli/archive/2012/05/09/2491191.html The specific mapping relationship is as follows.
typedef struct {
unsigned short bfType;
unsigned long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned long bfOffBits;
} ClBitMapFileHeader;
typedef struct {
unsigned long biSize;
long biWidth;
long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned long biCompression;
unsigned long biSizeImage;
long biXPelsPerMeter;
long biYPelsPerMeter;
unsigned long biClrUsed;
unsigned long biClrImportant;
} ClBitMapInfoHeader;
typedef struct {
unsigned char rgbBlue;
unsigned char rgbGreen;
unsigned char rgbRed;
unsigned char rgbReserved;
} ClrgbMap;
class ClImgBMP {
public:
ClBitMapFileHeader bmpFileHeaderData;
ClBitMapInfoHeader bmpInfoHeaderData;
ClrgbMap colorMap[256];
vector<unsigned char> imgData;
bool LoadImage(const char* path);
bool SaveImage(const char* path);
};
Use Windows Imaging Component to read images (compatible with common formats such as bmp, jpg, png, etc.)
1. Use CoCreateInstance to create an IWICImagingFactory 2. Use IWICImagingFactory::CreateDecoderFromFilename to create an IWICBitmapDecoder 3. Use IWICBitmapDecoder::GetFrame to get an IWICBitmapFrameDecoder 4. Use IWICImagingFactory::CreateFormatConverter Create an IWICFormatConverter and Initialize it using your favorite format, and use the object created in the third step to call the IWICFormatConverter::Initialize function 5. If the fourth step is successful, then convert the IWICFormatConverter into an IWICBitmapSource, otherwise convert the IWICBitmapFrameDecoder into an IWICBitmapSource 6. Use IWICImagingFactory::CreateBitmapFromSource to get IWICBitmap from IWICBitmapSource
Use Direct2D to get graphics
Since there is a lot of d2d information, please search it yourself. The first is to create an empty bitmap, then use this bitmap to create an ID2D1RenderTarget, and then use ID2D1RenderTarget::CreateBitmapFromWicBitmap to create an ID2D1Bitmap from the IWICBitmap just obtained. In this way, you have two bitmaps, the first is read from the file, and the second is a blank bitmap you created. Finally, use the various effects, shaders and functions of the render target. Use any effect you like, such as rotation, grayscale, binary, etc., to draw the read bitmap onto the blank bitmap. Finally, save the bitmap and you're done.
Summary
The most difficult part is reading and writing files, and the effects are all ready-made. Direct2D is easier to use than GDI+, has higher performance, and is in no way compatible with Windows XP.
The BMP format is really too simple. To be honest, there is nothing wrong with interpreting it by hand.
Depending on the size of your specific needs and the quality of your hardware (extreme assumption: such as a low-end 32-bit ARM Cortex M0 microcontroller), any of the following is a good choice:
There are many simple and specialized bmp libraries to choose from, but usually these libraries can only read bmp. For example, I have used EasyBMP http://easybmp.sourceforge.net/
It’s okay to do it by hand
In fact, opencv is most recommended. This can maximize the convenience of inputting other file formats and subsequent various graphics algorithms.
There are two ways, 1 Use a third-party library. In addition to the above mentioned, you can also choose skia
2 Search the Internet for a code that reads bmp to a two-dimensional array and a code that writes a two-dimensional array to bmp. You need a relatively simple function that can be implemented by yourself. Rotation relies on matrix transformation and interpolation. Grayscale images and binary images can be calculated directly according to the definition.
BMP data is not compressed in any way and is placed after the file header. It is not difficult to decode by hand. It is mainly file header + data. And the file header is not difficult, it is very clear. For the specific BMP header, the author can search for it.
I suggest that if you have time, you can solve it by hand, so that you can better understand the format of BMP files.
What a coincidence?
I found that all the libraries found are very huge and have a high level of abstraction, which cannot meet the needs.
I just wrote a C++ class for reading and writing bmp, which supports 8-bit grayscale images and 24-bit RGB images.
https://github.com/edimetia3d/simpleBMP
The code is very short. In fact, you can understand what is done by looking at the source code for 10 minutes.
A brief explanation:
There is no abstraction. Reading is to map all the data in the bmp (yes, every byte is used) to a defined variable.
Saving means writing these variables back to disk.
In fact, I originally planned to write it completely in C. I am not too interested in dynamic memory, so I used vector
For the read and write part, I still use fread fwrite. If the vector part is replaced by dynamic memory, it can be used in C Running below.
For the meaning of each variable, see
http://www.cnblogs.com/xiekeli/archive/2012/05/09/2491191.html
The specific mapping relationship is as follows.
Use Windows Imaging Component to read images (compatible with common formats such as bmp, jpg, png, etc.)
1. Use CoCreateInstance to create an IWICImagingFactory
2. Use IWICImagingFactory::CreateDecoderFromFilename to create an IWICBitmapDecoder
3. Use IWICBitmapDecoder::GetFrame to get an IWICBitmapFrameDecoder
4. Use IWICImagingFactory::CreateFormatConverter Create an IWICFormatConverter and Initialize it using your favorite format, and use the object created in the third step to call the IWICFormatConverter::Initialize function
5. If the fourth step is successful, then convert the IWICFormatConverter into an IWICBitmapSource, otherwise convert the IWICBitmapFrameDecoder into an IWICBitmapSource
6. Use IWICImagingFactory::CreateBitmapFromSource to get IWICBitmap from IWICBitmapSource
Use Direct2D to get graphics
Since there is a lot of d2d information, please search it yourself. The first is to create an empty bitmap, then use this bitmap to create an ID2D1RenderTarget, and then use ID2D1RenderTarget::CreateBitmapFromWicBitmap to create an ID2D1Bitmap from the IWICBitmap just obtained. In this way, you have two bitmaps, the first is read from the file, and the second is a blank bitmap you created. Finally, use the various effects, shaders and functions of the render target. Use any effect you like, such as rotation, grayscale, binary, etc., to draw the read bitmap onto the blank bitmap. Finally, save the bitmap and you're done.
Summary
The most difficult part is reading and writing files, and the effects are all ready-made. Direct2D is easier to use than GDI+, has higher performance, and is in no way compatible with Windows XP.
OpenCV
I usually use this library myself
https://github.com/nothings/stb
imagick http://www.imagemagick.org
The BMP format is really too simple. To be honest, there is nothing wrong with interpreting it by hand.
Depending on the size of your specific needs and the quality of your hardware (extreme assumption: such as a low-end 32-bit ARM Cortex M0 microcontroller), any of the following is a good choice:
opencv, itself a c++ library
imagemagick’s magick++ library http://www.imagemagick.org/script/magick++.php
There are many simple and specialized bmp libraries to choose from, but usually these libraries can only read bmp.
For example, I have used EasyBMP http://easybmp.sourceforge.net/
It’s okay to do it by hand
In fact, opencv is most recommended. This can maximize the convenience of inputting other file formats and subsequent various graphics algorithms.
There are two ways,
1 Use a third-party library. In addition to the above mentioned, you can also choose skia
2 Search the Internet for a code that reads bmp to a two-dimensional array and a code that writes a two-dimensional array to bmp. You need a relatively simple function that can be implemented by yourself. Rotation relies on matrix transformation and interpolation. Grayscale images and binary images can be calculated directly according to the definition.
STB
https://github.com/nothings/stb
FreeImage
NvImage
There is also a library I made myself
ImagePP
https://github. com/lalalaring/ImagePP
opencv gdal
BMP data is not compressed in any way and is placed after the file header. It is not difficult to decode by hand. It is mainly file header + data. And the file header is not difficult, it is very clear. For the specific BMP header, the author can search for it.
I suggest that if you have time, you can solve it by hand, so that you can better understand the format of BMP files.