19,446
社区成员




#include "stdafx.h"
#include"stdio.h"
#include"dos.h"
#include "stdlib.h"
#include"math.h"
//定义bmp结构
typedef struct
{
int bfType; /* 类型标志,总是BM */
long bfSize; /* 文件大小 */
int bfReserved1;
int bfReserved2;
long bfOffBits; /* 位图点阵偏移量*/
}HEAD;
typedef struct
{
long biSize; /* 结构体字节总数 */
long biWidth; /* 图像宽度 */
long biHeight; /*图像高度 */
int biPlanes; /* 必须为1 */
int biBitCount; /* 每个像素所占二进制位数,可能是1,4,8或 24 */
long biCompress; /*压缩方式*/
long biSizeImage; /*像素点阵大小 */
long biXPelsPerMeter; /* 水平像素数*/
long biYPelsPerMeter; /* 垂直像素数 */
long biClrUsed; /*使用的颜色数 */
long biClrImportant; /*重要颜色数 */
}INFO;
typedef struct
{
unsigned char rgbBlue; /*蓝色所占比重*/
unsigned char rgbGreen; /*绿色所占比重*/
unsigned char rgbRed; /*红色所占比重*/
unsigned char rgbReserved; /*保留字节 */
}RGBQUAD;
//定义一些变量
RGBQUAD straPla[256]; /*256色调色板*/
HEAD strHead;
INFO strInfo;
int main(int argc, char* argv[])
{ //定义文件指针
char filename[30];
FILE *fpi;
printf("输入bmp文件名:");
scanf("%s",&filename);
if((fpi=fopen(filename,"rb"))==NULL)
{
printf("OPEN SOURCE FILE ERROR\n");
exit(0);
}
//读取BMP文件的文件头,信息头
fread((char*)&strHead,1,sizeof(strHead),fpi);
fread((char*)&strInfo,1,sizeof(strInfo),fpi);
//读取BMP的256色颜色表
for(int nCounti=0;nCounti<strInfo.biClrUsed;nCounti++)
{
fread((char*)&straPla[nCounti],1,sizeof(RGBQUAD),fpi);
}
//此时fpi指针应该指向了图像数据!
//测试数据
int count=strHead.bfType; //文件头标志
printf("bitBitCount value is %x\n",count);
}
int MyDib::LoadBmpTwo(const char * lpszFileName)
{
CFile cf;
BITMAPFILEHEADER BFH;
DWORD dwDibSize;
if(!cf.Open(lpszFileName,CFile::modeRead))
return 1; //没打开文件
dwDibSize = cf.GetLength() - sizeof(BITMAPFILEHEADER);
if(m_pDib!=NULL) delete [] m_pDib;
m_pDib = new BYTE [dwDibSize]; //建立原始DIB
if(m_pDib == NULL)
return 2; //建立DIB出错
if(cf.Read(&BFH,sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER) ||
BFH.bfType != 'MB' || cf.Read(m_pDib,dwDibSize)!=dwDibSize)
{delete [] m_pDib; return 3;} //读DIB出错
cf.Close();
if(m_pDibParim!=NULL) delete [] m_pDibParim;
m_pDibParim = new BYTE [dwDibSize];
if(m_pDibParim == NULL) return 4;//复制出错
memcpy(m_pDibParim,m_pDib,dwDibSize);
bFileRead = true;
return 0; //成功
}
CPaintDC dc(this);
CBitmap bm;
//bm.LoadBitmap( IDB_BITMAP1 ); 用2楼的方法。
CDC *pdc = new CDC;
pdc->CreateCompatibleDC( &dc );
CBitmap *p = pdc->SelectObject( &bm );
dc.BitBlt( 0, 0, 100, 100, pdc, 0, 0, SRCCOPY );
pdc->SelectObject( p );
pdc->DeleteDC();
delete pdc;
CDialog::OnPaint();