void CTestDlg::ShowBMP(CPaintDC* pDC)
{
char hzcell[500][500]; HBITMAP hBitmap = NULL;
LPSTR lpBits; BITMAPFILEHEADER Bfh;
LPBITMAPINFO lpBmi;
FILE *fp;
int BmiSize,PixSize;
fp = fopen("test.bmp","rb"); // test.bmp 是一个单色位图 大小是 223*163
fread(&Bfh,sizeof(BITMAPFILEHEADER),1,fp); // 读位图文件头
BmiSize = Bfh.bfOffBits-sizeof(BITMAPFILEHEADER); // 计算位图信息大小
lpBmi = (LPBITMAPINFO) malloc(BmiSize); // 申请位图信息存储空间
fread(lpBmi,BmiSize,1,fp); // 读入位图信息
hBitmap = CreateDIBSection(NULL,lpBmi,DIB_RGB_COLORS,(VOID**)&lpBits,NULL,0); // 建立DIBSection
int wid = lpBmi->bmiHeader.biWidth; // 保存图像参数 图像宽
int hei = lpBmi->bmiHeader.biHeight; // 保存图像参数 图像高
int bits = lpBmi->bmiHeader.biBitCount; // 图像每像素所占位数
PixSize = (wid*bits+31)/32*4*hei; // 计算像素数据大小
free(lpBmi); // 释放位图信息 fseek(fp,Bfh.bfOffBits,SEEK_SET);
fread(lpBits,PixSize,1,fp); // 读取像素数据 for(int r=0;r<120;r++)
for(int c=0;c<120;c++)
hzcell[r][c]=0; int rowchars=(wid*bits+31)/32*4;
for(r=0;r<hei;r++)
{
for(int c=0;c<rowchars;c++)
{
int num=lpBits[r*rowchars+c];
int at=0;
while(num>0)
{
if(8*c+7-at<wid)
hzcell[r][8*c+7-at]=num%2;
num=num/2;
at++;
}
}
}
fclose(fp);
for(r=0;r<hei;r++)
for(int c=0;c<wid;c++)
if(hzcell[r][c]==1)
pDC->SetPixel(100+c,100+r,RGB(0,0,0));}
解决方案 »
- 关于UNICODE的问题
- 请问哪本书上有专门介绍ACTIVEX控件编程的?
- 请问键盘指法有没有标准的规定?
- char[]型数据如何存储成DATETIME格式的
- 有熟悉MFC界面的知道如何将显示部分用多线程处理吗
- 请教:VC6.0下使用list
- 为什么用SetupDiEnumDeviceInterfaces总是返回ERROR_NO_MORE_ITEMS?
- 急救!请大家帮我!
- 为何从CAxDialogImpl继承的对话框上放上有些控件(如list控件)对话框就显示不出来了?
- 上下左右的键的ASC码是多少?
- 想做个IE插件实现这个功能,该看哪些资料呢?
- 我在尝试使用dll,函数很简单,但是传递过去的参数的值是错误的
一是函数参数类型最好用CDC*而不是CPaintDC*;
二是文件最好一次读入然后用指针指向不同位置来解析。
三是既然逐点描绘,就不用创建位图了。
然后对你后面的处理看不明白,单色位图的话直接按照每个点绘制到界面上去就行了,一个字节8个点,用位运算取值。
char hzcell[500][500]; 中然后,对有数据的位置画点
黑色位置为 true 白色位置为 false
然后 根据 hzcell 信息 直接画像素
for(r=0;r <hei;r++)
for(int c=0;c <wid;c++)
if(hzcell[r][c])
pDC->SetPixel(100+c,100+r,RGB(0,0,0)); 以下为 该功能的 改进函数:void CTestDlg::ShowBMP(CPaintDC* pDC)
{
bool hzcell[500][500]; // 用于保存单色BMP 文件像素信息,黑色位置为 true 白色位置为 false HBITMAP hBitmap = NULL;
LPSTR lpBits; BITMAPFILEHEADER Bfh;
LPBITMAPINFO lpBmi;
FILE *fp;
int BmiSize,PixSize;
fp = fopen("test.bmp","rb"); // test.bmp 是一个单色位图 大小是 223*163
fread(&Bfh,sizeof(BITMAPFILEHEADER),1,fp); // 读位图文件头
BmiSize = Bfh.bfOffBits-sizeof(BITMAPFILEHEADER); // 计算位图信息大小
lpBmi = (LPBITMAPINFO) malloc(BmiSize); // 申请位图信息存储空间
fread(lpBmi,BmiSize,1,fp); // 读入位图信息
hBitmap = CreateDIBSection(NULL,lpBmi,DIB_RGB_COLORS,(VOID**)&lpBits,NULL,0); // 建立DIBSection
int wid = lpBmi->bmiHeader.biWidth; // 保存图像参数 图像宽
int hei = lpBmi->bmiHeader.biHeight; // 保存图像参数 图像高
int bits = lpBmi->bmiHeader.biBitCount; // 图像每像素所占位数
PixSize = (wid*bits+31)/32*4*hei; // 计算像素数据大小
free(lpBmi); // 释放位图信息 fseek(fp,Bfh.bfOffBits,SEEK_SET);
fread(lpBits,PixSize,1,fp); // 读取像素数据 ,存放在 lpBits 指向的内存中 for(int r=0;r <120;r++)
for(int c=0;c <120;c++)
hzcell[r][c]=0; // 初始化 像素信息矩阵 int rowchars=(wid*bits+31)/32*4; // 每行像素所需的字节数
for(r=0;r <hei;r++)
{
for(int c=0;c <rowchars;c++)
{
char num=lpBits[r*rowchars+c];
for(int at=0;at<8;at++)
{
hzcell[r][8*c+7-at]=num&1;
num>>1;
}
}
}
fclose(fp);
// 显示 位图信息
for(r=0;r <hei;r++)
for(int c=0;c <wid;c++)
if(hzcell[r][c])
pDC->SetPixel(100+c,100+r,RGB(0,0,0)); }
CDC *pdc=GetDC();
ShowBMP(pdc);函数修改如下:
void CStrapdownPlatformDlg::ShowBMP(CDC* pDC)
{
bool hzcell[500][500]; // 用于保存单色BMP 文件像素信息,黑色位置为 true 白色位置为 false HBITMAP hBitmap = NULL;
LPSTR lpBits; BITMAPFILEHEADER Bfh;
LPBITMAPINFO lpBmi;
FILE *fp;
int BmiSize,PixSize;
fp = fopen("test.bmp","rb"); // test.bmp 是一个单色位图 大小是 223*163
fread(&Bfh,sizeof(BITMAPFILEHEADER),1,fp); // 读位图文件头
BmiSize = Bfh.bfOffBits-sizeof(BITMAPFILEHEADER); // 计算位图信息大小
lpBmi = (LPBITMAPINFO) malloc(BmiSize); // 申请位图信息存储空间
fread(lpBmi,BmiSize,1,fp); // 读入位图信息
hBitmap = CreateDIBSection(NULL,lpBmi,DIB_RGB_COLORS,(VOID**)&lpBits,NULL,0); // 建立DIBSection
int wid = lpBmi->bmiHeader.biWidth; // 保存图像参数 图像宽
int hei = lpBmi->bmiHeader.biHeight; // 保存图像参数 图像高
int bits = lpBmi->bmiHeader.biBitCount; // 图像每像素所占位数
PixSize = (wid*bits+31)/32*4*hei; // 计算像素数据大小
free(lpBmi); // 释放位图信息 fseek(fp,Bfh.bfOffBits,SEEK_SET);
fread(lpBits,PixSize,1,fp); // 读取像素数据 ,存放在 lpBits 指向的内存中 for(int r=0;r <120;r++)
for(int c=0;c <120;c++)
hzcell[r][c]=0; // 初始化 像素信息矩阵 int rowchars=(wid*bits+31)/32*4; // 每行像素所需的字节数
for(r=0;r <hei;r++)
{
for(int c=0;c <rowchars;c++)
{
char num=lpBits[r*rowchars+c];
for(int at=0;at <8;at++)
{
hzcell[r][8*c+7-at]=num&1;
num=num>>1; //修改
}
}
}
fclose(fp);
// 显示 位图信息
for(r=0;r <hei;r++)
for(int c=0;c <wid;c++)
if(hzcell[r][c])
pDC->SetPixel(100+c,200-r,RGB(255,255,255));//修改,要不上下颠倒
else
pDC->SetPixel(100+c,200-r,RGB(0,0,0)); }
CDC *pdc=GetDC();
ShowBMP(pdc);函数修改如下:
void CStrapdownPlatformDlg::ShowBMP(CDC* pDC)
{
bool hzcell[500][500]; // 用于保存单色BMP 文件像素信息,黑色位置为 true 白色位置为 false HBITMAP hBitmap = NULL;
LPSTR lpBits; BITMAPFILEHEADER Bfh;
LPBITMAPINFO lpBmi;
FILE *fp;
int BmiSize,PixSize;
fp = fopen("test.bmp","rb"); // test.bmp 是一个单色位图 大小是 223*163
fread(&Bfh,sizeof(BITMAPFILEHEADER),1,fp); // 读位图文件头
BmiSize = Bfh.bfOffBits-sizeof(BITMAPFILEHEADER); // 计算位图信息大小
lpBmi = (LPBITMAPINFO) malloc(BmiSize); // 申请位图信息存储空间
fread(lpBmi,BmiSize,1,fp); // 读入位图信息
hBitmap = CreateDIBSection(NULL,lpBmi,DIB_RGB_COLORS,(VOID**)&lpBits,NULL,0); // 建立DIBSection
int wid = lpBmi->bmiHeader.biWidth; // 保存图像参数 图像宽
int hei = lpBmi->bmiHeader.biHeight; // 保存图像参数 图像高
int bits = lpBmi->bmiHeader.biBitCount; // 图像每像素所占位数
PixSize = (wid*bits+31)/32*4*hei; // 计算像素数据大小
free(lpBmi); // 释放位图信息 fseek(fp,Bfh.bfOffBits,SEEK_SET);
fread(lpBits,PixSize,1,fp); // 读取像素数据 ,存放在 lpBits 指向的内存中 for(int r=0;r <120;r++)
for(int c=0;c <120;c++)
hzcell[r][c]=0; // 初始化 像素信息矩阵 int rowchars=(wid*bits+31)/32*4; // 每行像素所需的字节数
for(r=0;r <hei;r++)
{
for(int c=0;c <rowchars;c++)
{
char num=lpBits[r*rowchars+c];
for(int at=0;at <8;at++)
{
hzcell[r][8*c+7-at]=num&1;
num=num>>1; //修改
}
}
}
fclose(fp);
// 显示 位图信息
for(r=0;r <hei;r++)
for(int c=0;c <wid;c++)
if(hzcell[r][c])
pDC->SetPixel(100+c,200-r,RGB(255,255,255));//修改,要不上下颠倒
else
pDC->SetPixel(100+c,200-r,RGB(0,0,0)); }