首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-08-09 
求纯c++写的读取32位bmp图的开源类如题,是纯c++编写的,不能用到其他如mfc类库之类的,或者是纯c++读取32位b

求纯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)库。

引用:
如题,是纯c++编写的,不能用到其他如mfc类库之类的,或者是纯c++读取32位bitmap位图相关代码,里面存储一个char*的数组。之前找到过了一开源类,不过只能用24位的


[解决办法]
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吧。

热点排行