求纯c++写的读取32位bmp图的开源类

qinken547 2013-07-31 06:16:08
如题,是纯c++编写的,不能用到其他如mfc类库之类的,或者是纯c++读取32位bitmap位图相关代码,里面存储一个char*的数组。之前找到过了一开源类,不过只能用24位的
...全文
283 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
gnimgnot 2013-08-04
  • 打赏
  • 举报
回复
看看gdal吧。
asyuae 2013-08-04
  • 打赏
  • 举报
回复
opencv
todd_leftcode 2013-08-04
  • 打赏
  • 举报
回复
3#正解(话说CSDN要求回帖长度最小6个字符很无聊的说)
lm_whales 2013-08-04
  • 打赏
  • 举报
回复
直接API 就可以了. 甚至Api也可以忽略. 直接读写也行. Api LoadImage 可以得到 位图文件数据. 然后可以修改,然后写回文件.这是修改. LoadImage 可以得到位图句柄,然后 窗口过程处理,WM_PAINT 消息中,可以写到 HDC 上.这就是读图像,并显示了.
lm_whales 2013-08-01
  • 打赏
  • 举报
回复
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; 高,负值表示正向位图,和屏幕显示的一样,第一行是最上面显示的数据。 正值表示反向位图,和屏幕显示的是镜像的。
图灵狗 2013-07-31
  • 打赏
  • 举报
回复
试试FreeImage(freeimage.sourceforge.net)库。
引用 楼主 qinken547 的回复:
如题,是纯c++编写的,不能用到其他如mfc类库之类的,或者是纯c++读取32位bitmap位图相关代码,里面存储一个char*的数组。之前找到过了一开源类,不过只能用24位的
max_min_ 2013-07-31
  • 打赏
  • 举报
回复

/*计算数组下标*/
#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))


qinken547 2013-07-31
  • 打赏
  • 举报
回复
CxImage太庞大了,我是找来公用的,不需要很复杂,只需要一些基本的接口就可以了

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧