本帖最后由 周杰伦 于 2012-9-23 14:56 编辑
本人最近在用VC++6.0做上位机。希望能够做一个在线的而非SD卡的图像显示。
那么最大的问题就是将采到的二值化的点变BMP图像的问题。
照着MSDN自己写了一个二值化数组->BMP文件的代码。本意是0打黑的像素,1打败的像素。但是调色板那里不知道怎么弄。。。。现在上代码,上文件。希望大家一起研究。对研究上位机有用的。
也请论坛大牛瞅瞅,不妨提出点意见呢。
上两份文件给大家瞅瞅BMP结构,希望大家一起研究。
//必要头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <iostream.h>
#include <windows.h>
void main()
{
FILE *fp;
int width=20,height=13,i;
BITMAPFILEHEADER fileheader;
BITMAPINFOHEADER infoheader;
RGBQUAD index[2]; //调色基础
char* name="002.bmp";
fp=fopen(name, "wb");
unsigned char*data=new unsigned char[width*height]; //这个指针用于存放图像
unsigned char datatemp[260]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,
1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,
1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
};
for(i=0;i<260;i++)
{
data=datatemp;
}
//写文件头
fileheader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*2;
// fileheader.bfReserved1=0;
// fileheader.bfReserved2=0
fileheader.bfType=0x4d42;
//fileheader.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256+sizeof(char)*width*height;
//写信息头
infoheader.biBitCount=1; //写图像的位数 1表示2^1种颜色
//infoheader.biClrImportant=0;
infoheader.biClrUsed=2; // 位图实际使用的颜色表中的颜色数
infoheader.biCompression=0; // 位图压缩类型 0 表示无压缩
infoheader.biHeight=height; //图像的长度
infoheader.biWidth=width; //图像的宽度
infoheader.biSize=sizeof(BITMAPINFOHEADER); //创建需要的文件大小
//infoheader.biSizeImage=width*height*sizeof(char);
//infoheader.biPlanes=1; // 目标设备的级别,必须为1
//infoheader.biXPelsPerMeter=10; // 位图水平分辨率,每米像素数
//infoheader.biYPelsPerMeter=10; // 位图垂直分辨率,每米像素数
fwrite(&fileheader,sizeof(BITMAPFILEHEADER),1,fp); //写文件头
fwrite(&infoheader,sizeof(BITMAPINFOHEADER),1,fp); //写信息头
/* for(i=0;i<2;i++)
{
index.rgbBlue=i;
index.rgbGreen=i;
index.rgbRed=i;
index.rgbReserved=0;
}*/
index[0].rgbBlue=255;
index[0].rgbGreen=255;
index[0].rgbRed=255;
index[0].rgbReserved=0;
index[1].rgbBlue=0;
index[1].rgbGreen=0;
index[1].rgbRed=0;
index[1].rgbReserved=0;
fwrite(index,sizeof(RGBQUAD),2,fp);
// for(i=0;i<height*width;i++)
// data=rand()%2;
fwrite(data,1,width*height,fp); //写入数据 但它是一个一维数据//串口发上来的数据有必要进行转化的
fclose(fp);
delete [] data; //清空内存
}
|