求纯c++写的读取32位bmp图的开源类
如题,是纯c++编写的,不能用到其他如mfc类库之类的,或者是纯c++读取32位bitmap位图相关代码,里面存储一个char*的数组。之前找到过了一开源类,不过只能用24位的
[解决办法]
/*计算数组下标*/
#define ARRAY_INDEX(index, BitNum) ((index) / (BitNum))
/*计算BIT位*/
#define BIT_INDEX(index, BitNum) ((index) % (BitNum))
#define CLR_BIT_NUM(addr, index, BitNum, type) \
*(addr + ARRAY_INDEX(index, BitNum)) &= \
(~(((type)0x01) << BIT_INDEX(index, BitNum)))
#define SET_BIT_NUM(addr, index, BitNum, type) \
*(addr + ARRAY_INDEX(index, BitNum))
[解决办法]
= \
(((type)0x01) << BIT_INDEX(index, BitNum))
#define CHK_BIT_NUM(addr, index, BitNum, type) \
(*(addr + ARRAY_INDEX(index, BitNum)) >> BIT_INDEX(index, BitNum)) & ((type)0x01)
#define CLR_BIT_LONG(addr, index) (CLR_BIT_NUM(addr, index, 32, unsigned long))
#define SET_BIT_LONG(addr, index) (SET_BIT_NUM(addr, index, 32, unsigned long))
#define CHK_BIT_LONG(addr, index) (CHK_BIT_NUM(addr, index, 32, unsigned long))
#define CLR_BIT_UNINT(addr, index) (CLR_BIT_NUM(addr, index, 32, unsigned int))
#define SET_BIT_UNINT(addr, index) (SET_BIT_NUM(addr, index, 32, unsigned int))
#define CHK_BIT_UNINT(addr, index) (CHK_BIT_NUM(addr, index, 32, unsigned int))
[解决办法]
试试FreeImage(freeimage.sourceforge.net)库。
[解决办法]
1Bit BW
4Bits LRGB 或者调色板(颜色表),有可能采用RLE压缩
BGR
8Bits 调色板(颜色表) , ),有可能采用RLE压缩
其中 OS2位图 24 BIT BGR颜色表 ,Windows位图, 32位BGRA颜色表
16BITS 565 //无颜色表,
15BITS 1555 //无颜色表
24Bits 888 //无颜色表
BGRA
32Bits 8888 //无颜色表
这是Windows 95 的位图,V3 格式了
更新的可以包含JPG格式数据 V4 --Wint98,V5 WinNT
位图信息:
typedef struct tagBITMAPINFO { // bmi
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
位图信息头
typedef struct tagBITMAPINFOHEADER{ // bmih
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
typedef struct {
DWORD bV4Size;
LONG bV4Width;
LONG bV4Height;
WORD bV4Planes;
WORD bV4BitCount;
DWORD bV4V4Compression;
DWORD bV4SizeImage;
LONG bV4XPelsPerMeter;
LONG bV4YPelsPerMeter;
DWORD bV4ClrUsed;
DWORD bV4ClrImportant;
DWORD bV4RedMask;
DWORD bV4GreenMask;
DWORD bV4BlueMask;
DWORD bV4AlphaMask;
DWORD bV4CSType;
CIEXYZTRIPLE bV4Endpoints;
DWORD bV4GammaRed;
DWORD bV4GammaGreen;
DWORD bV4GammaBlue;
} BITMAPV4HEADER, FAR *LPBITMAPV4HEADER, *PBITMAPV4HEADER;
typedef struct {
DWORD bV5Size;
LONG bV5Width;
LONG bV5Height;
WORD bV5Planes;
WORD bV5BitCount;
DWORD bV5Compression;
DWORD bV5SizeImage;
LONG bV5XPelsPerMeter;
LONG bV5YPelsPerMeter;
DWORD bV5ClrUsed;
DWORD bV5ClrImportant;
DWORD bV5RedMask;
DWORD bV5GreenMask;
DWORD bV5BlueMask;
DWORD bV5AlphaMask;
DWORD bV5CSType;
CIEXYZTRIPLE bV5Endpoints;
DWORD bV5GammaRed;
DWORD bV5GammaGreen;
DWORD bV5GammaBlue;
DWORD bV5Intent;
DWORD bV5ProfileData;
DWORD bV5ProfileSize;
DWORD bV5Reserved;
} BITMAPV5HEADER, FAR *LPBITMAPV5HEADER, *PBITMAPV5HEADER;
#define BI_JPEG 4L
颜色表的一个项:
typedef struct tagRGBQUAD { // rgbq
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
文件头
typedef struct tagBITMAPFILEHEADER { // bmfh
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER
Os2 位图信息:
typedef struct _BITMAPCOREINFO { // bmci
BITMAPCOREHEADER bmciHeader;
RGBTRIPLE bmciColors[1];
} BITMAPCOREINFO;
信息头
typedef struct tagBITMAPCOREHEADER { // bmch
DWORD bcSize;
WORD bcWidth;
WORD bcHeight;
WORD bcPlanes;
WORD bcBitCount;
} BITMAPCOREHEADER;
Os2 颜色表:
typedef struct tagRGBTRIPLE { // rgbt
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} RGBTRIPLE;
PS:
位图格式,可能是最简单的图像格式,但是Windows的位图格式是相当复杂的。
大概,了解一下,8,15,16,24,32 Bits位图,差不多就够了
15,16,24,32 Bits位图,没有颜色表(调色板),所以代码差不多,每行字节数计算对了就行了。
注意:15 Bits也是16 BITS位图。
1,4,8 是有的。4,8有可能RLE压缩。
biBitCount 就是这1,4,8,15,16,24,32这几个值。
biPlanes 没有用处,
LONG biWidth; 宽
LONG biHeight; 高,负值表示正向位图,和屏幕显示的一样,第一行是最上面显示的数据。
正值表示反向位图,和屏幕显示的是镜像的。
[解决办法]
直接API 就可以了.
甚至Api也可以忽略.
直接读写也行.
Api LoadImage 可以得到 位图文件数据.
然后可以修改,然后写回文件.这是修改.
LoadImage 可以得到位图句柄,然后
窗口过程处理,WM_PAINT 消息中,可以写到 HDC 上.这就是读图像,并显示了.
[解决办法]
看看gdal吧。