70,016
社区成员




#include <stdio.h>
#include <stdlib.h>
#pragma pack(2)
/*定义WORD为两个字节的类型*/
typedef unsigned short WORD;
/*定义DWORD为e四个字节的类型*/
typedef unsigned long DWORD;
/*位图文件头*/
typedef struct BMP_FILE_HEADER
{
WORD bType; /* 文件标识符 */
DWORD bSize; /* 文件的大小 */
WORD bReserved1; /* 保留值,必须设置为0 */
WORD bReserved2; /* 保留值,必须设置为0 */
DWORD bOffset; /* 文件头的最后到图像数据位开始的偏移量 */
} BMPFILEHEADER;
/*位图信息头*/
typedef struct BMP_INFO
{
DWORD bInfoSize; /* 信息头的大小 */
DWORD bWidth; /* 图像的宽度 */
DWORD bHeight; /* 图像的高度 */
WORD bPlanes; /* 图像的位面数 */
WORD bBitCount; /* 每个像素的位数 */
DWORD bCompression; /* 压缩类型 */
DWORD bmpImageSize; /* 图像的大小,以字节为单位 */
DWORD bXPelsPerMeter; /* 水平分辨率 */
DWORD bYPelsPerMeter; /* 垂直分辨率 */
DWORD bClrUsed; /* 使用的色彩数 */
DWORD bClrImportant; /* 重要的颜色数 */
} BMPINF;
/*彩色表*/
typedef struct RGB_QUAD
{
WORD rgbBlue; /* 蓝色强度 */
WORD rgbGreen; /* 绿色强度 */
WORD rgbRed; /* 红色强度 */
WORD rgbReversed; /* 保留值 */
} RGBQUAD;
int main()
{
FILE *fp;
BMPFILEHEADER fileHeader;
BMPINF infoHeader;
long offset, bmpImageSize, width, height, bytesPerPixel, size, bitCount;
// int i, j;
// unsigned char **p;
WORD c;
if((fp = fopen("5.bmp", "rb")) == NULL)
{
printf("Cann't open the file!\n");
exit(0);
}
fseek(fp, 0, 0);
fread(&fileHeader, sizeof(fileHeader), 1, fp);
fread(&infoHeader, sizeof(infoHeader), 1, fp);
//计算并输出位图数据的偏移量,图像的大小,宽度和高度,每个像素点所占的字节
size = fileHeader.bSize;
offset = fileHeader.bOffset;
bmpImageSize = infoHeader.bmpImageSize;
width = infoHeader.bWidth;
height = infoHeader.bHeight;
bitCount = infoHeader.bBitCount;
bytesPerPixel = infoHeader.bBitCount / 8;
printf("%d %d %d %d %d %d\n", size, offset, bmpImageSize, width, height, bitCount, bytesPerPixel);
//输出每个像素点所占字节中的内容
c = fgetc(fp);
while (!feof(fp))
{
printf("%x ", c);
c = fgetc(fp);
}
printf("\n");
fclose(fp);
return 0;
}
BITMAPFILEHEADER m_bmf;
BITMAPINFO m_bmi;
BYTE* m_lpData = NULL;
UINT m_ncbCount = 0;
UINT CBmpWatermark::LoadImage(LPCTSTR lpszFile)
{
FILE* fp = _tfopen(lpszFile, _T("r+b"));
if(!fp)
return 0;
fseek(fp, 0, SEEK_SET);
// 文件头
memset(&m_bmf, 0, sizeof(m_bmf));
fread(&m_bmf, sizeof(m_bmf), 1, fp);
// 位图信息头
memset(&m_bmi, 0, sizeof(m_bmi));
fread(&m_bmi, sizeof(m_bmi), 1, fp);
// 只有回退4BYTE,结果才是对的,估计是因为没有调色盘而多读取了4BYTE的缘故
fseek(fp, -4, SEEK_CUR);
if(m_bmi.bmiHeader.biCompression == BI_RGB)
m_bmi.bmiHeader.biSizeImage = m_bmi.bmiHeader.biWidth * m_bmi.bmiHeader.biHeight * 3;
// 位图数据
m_ncbCount = m_bmi.bmiHeader.biSizeImage;
delete [] m_lpData;
m_lpData = new BYTE[m_ncbCount];
if(!m_lpData)
return 0;
fread(m_lpData, 1, m_ncbCount, fp);
return m_ncbCount;
}
#ifndef _BITMAP_H_
#define _BITMAP_H_
#define TRUE 1
#define FALSE 0
typedef char S8;
typedef short S16;
typedef int S32;
typedef long long S64;
typedef unsigned char U8;
typedef unsigned short U16;
typedef unsigned int U32;
typedef unsigned long long U64;
//typedef unsigned long LONG;
typedef int BOOL;
typedef U8 BYTE; /* 8 bit */
typedef U16 WORD; /* word: 16 bit */
//typedef U32 DWORD; /* dword: 32 bit */
/* 位图信息头:版本3 */
typedef struct _tagBITMAPINFOHEADER{
U32 biSize; /* 信息头长度:识别各种版本的唯一方法 */
U32 biWidth; /* 像素宽度 */
U32 biHeight; /* 像素高度,正:由下向上,负:由上至下 */
U16 biPlanes; /* 位平面,必须为1 */
U16 biBitCount; /* 每个像素的位数,如256色,8bit */
U32 biCompression; /* 压缩方法 */
U32 biSizeImage; /* 图像的像素阵列大小 */
U32 biXPelsPerMeter;
U32 biYPelsPerMeter;
U32 biClrUsed;
U32 biClrImportant;
} _BITMAPINFOHEADER, *_PBITMAPINFOHEADER;
/* 调色板格式:其它格式 */
typedef struct _tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} _RGBQUAD, *_PRGBQUAD;
/* 调色板格式:OS/2 */
typedef struct _tagRGBTRIPLE {
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} _RGBTRIPLE, *PRGBTRIPLE;
/* GDI定义了将信息头和颜色表组合在一起的数据结构 */
typedef struct _tagBITMAPINFO {
_BITMAPINFOHEADER bmiHeader;
_RGBQUAD bmiColors[1];
} _BITMAPINFO, *_PBITMAPINFO;
#endif /* _BITMAP_H_ */