本人最近刚开始学习相关知识,想自己编个程序实现如题功能,但编译后发现错误一大把。由于是初学C++实在找不出错误,恳求内行帮忙改正,改正后也可发到,若需要原图片验证请联系我。先谢过了!
说明:RGB数据是640*480*3的像素数据
#include <stdio.h>
#include <malloc.h>
#include <iostream.h>
#include <stdlib.h>
#define H 480
#define W 640
void main()
{
char filename1[50];
char filename2[50];
char filename3[50];
unsigned char image1[H][W];
unsigned char image2[H][W];
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; //文件类型,必须是0x424D,即字符串"BM"
DWORD bfSize; //文件大小,包括BITMAPFILEHEADER的14个字节
WORD bfReserved1; //保留字
WORD bfReserved2; //保留字
DWORD bfOffBits; //从文件头到实际的位图数据的偏移字节数
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;//本结构的长度,为40
LONG biWidth; //图象的宽度,单位是象素
LONG biHeight; //图象的高度,单位是象素
WORD biPlanes; //必须是1
WORD biBitCount;
//表示颜色时要用到的位数,1(单色), 4(16色), 8(256色), 24(真彩色)
DWORD biCompression;
//指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS等,BI_RGB表示不压缩
DWORD biSizeImage;
//实际的位图数据占用的字节数,即 biSizeImage=biWidth' × biHeight,biWidth'是biWidth 按照4的整倍数调整后的结果
LONG biXPelsPerMeter; //目标设备的水平分辨率,单位是每米的象素个数
LONG biYPelsPerMeter; //目标设备的垂直分辨率,单位是每米的象素个数
DWORD biClrUsed; //位图实际用到的颜色数,0表示颜色数为2biBitCount
DWORD biClrImportant; //位图中重要的颜色数,0表示所有颜色都重要
} BITMAPINFOHEADER;
BITMAPFILEHEADER bmfh;//bmfh赋值
bmfh.bfType=0x4d42;
bmfh.bfSize=54+640*480*3
bmfh.bfReserved1=bmfh.bfReserved2=0;
bmfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)=54;
BITMAPINFOHEADER bmih;//bmih赋值
bmih.biWidth=640;
bmih.biHeight=480;
bmih.biPlanes=1;
bmih.biBitCount=24;
bmih.biCompression=BI_RGB;
bmih.biSizeImage=640*480*3;
bmih.biXPelsPerMeter=0;
bmih.biYPelsPerMeter=0;
bmih.biClrUsed=0;
bmih.biClrImportant=0;
bmih.biSize=sizeof(BITMAPINFOHEADER);
file *pf=fopen(filename1,"wb");
fwrite(pf,&bmfh,sizeof(BITMAPFILEHEADER));
fwrite(pf,&bmih,sizeof(BITMAPINFOHEADER));
cout<<"请输入要打开的文件:"<<endl;
cin>>filename2;
FILE *fp;
if((fp=fopen(filename2,"rb"))==0)//输入要打开的文件
{
cout<<"Cannot open file,push any key!"<<endl;//如果不可打开,报错
getchar();
return;
}
fread(image1,1,640*480,fp);
for(int k=0;k<H;k++)
for(int j=0;j<W;j++)
{
image2[k][j]=image1[H-k-1][j];//转换坐标。若起初i=127,转化后row-127-1=128-127-1=0
// cout<<(int)oi[k][j]<<" ";
// if((k*Row+j)%10==0)
// cout<<endl;
}
cout<<endl;
cout<<"********************************************************************************"<<endl;
fwrite(image2,1,640*480,pf);
fclose(pf);
fclose(fp);
cout<<endl;
cout<<"********************************************************************************"<<endl;
cout<<"文件已保存,感谢使用!"<<endl;
}
说明:RGB数据是640*480*3的像素数据
#include <stdio.h>
#include <malloc.h>
#include <iostream.h>
#include <stdlib.h>
#define H 480
#define W 640
void main()
{
char filename1[50];
char filename2[50];
char filename3[50];
unsigned char image1[H][W];
unsigned char image2[H][W];
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; //文件类型,必须是0x424D,即字符串"BM"
DWORD bfSize; //文件大小,包括BITMAPFILEHEADER的14个字节
WORD bfReserved1; //保留字
WORD bfReserved2; //保留字
DWORD bfOffBits; //从文件头到实际的位图数据的偏移字节数
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;//本结构的长度,为40
LONG biWidth; //图象的宽度,单位是象素
LONG biHeight; //图象的高度,单位是象素
WORD biPlanes; //必须是1
WORD biBitCount;
//表示颜色时要用到的位数,1(单色), 4(16色), 8(256色), 24(真彩色)
DWORD biCompression;
//指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS等,BI_RGB表示不压缩
DWORD biSizeImage;
//实际的位图数据占用的字节数,即 biSizeImage=biWidth' × biHeight,biWidth'是biWidth 按照4的整倍数调整后的结果
LONG biXPelsPerMeter; //目标设备的水平分辨率,单位是每米的象素个数
LONG biYPelsPerMeter; //目标设备的垂直分辨率,单位是每米的象素个数
DWORD biClrUsed; //位图实际用到的颜色数,0表示颜色数为2biBitCount
DWORD biClrImportant; //位图中重要的颜色数,0表示所有颜色都重要
} BITMAPINFOHEADER;
BITMAPFILEHEADER bmfh;//bmfh赋值
bmfh.bfType=0x4d42;
bmfh.bfSize=54+640*480*3
bmfh.bfReserved1=bmfh.bfReserved2=0;
bmfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)=54;
BITMAPINFOHEADER bmih;//bmih赋值
bmih.biWidth=640;
bmih.biHeight=480;
bmih.biPlanes=1;
bmih.biBitCount=24;
bmih.biCompression=BI_RGB;
bmih.biSizeImage=640*480*3;
bmih.biXPelsPerMeter=0;
bmih.biYPelsPerMeter=0;
bmih.biClrUsed=0;
bmih.biClrImportant=0;
bmih.biSize=sizeof(BITMAPINFOHEADER);
file *pf=fopen(filename1,"wb");
fwrite(pf,&bmfh,sizeof(BITMAPFILEHEADER));
fwrite(pf,&bmih,sizeof(BITMAPINFOHEADER));
cout<<"请输入要打开的文件:"<<endl;
cin>>filename2;
FILE *fp;
if((fp=fopen(filename2,"rb"))==0)//输入要打开的文件
{
cout<<"Cannot open file,push any key!"<<endl;//如果不可打开,报错
getchar();
return;
}
fread(image1,1,640*480,fp);
for(int k=0;k<H;k++)
for(int j=0;j<W;j++)
{
image2[k][j]=image1[H-k-1][j];//转换坐标。若起初i=127,转化后row-127-1=128-127-1=0
// cout<<(int)oi[k][j]<<" ";
// if((k*Row+j)%10==0)
// cout<<endl;
}
cout<<endl;
cout<<"********************************************************************************"<<endl;
fwrite(image2,1,640*480,pf);
fclose(pf);
fclose(fp);
cout<<endl;
cout<<"********************************************************************************"<<endl;
cout<<"文件已保存,感谢使用!"<<endl;
}
你的意思是把RGB信息保存成一张BMP图片吧。你查下MSDN,有个例子叫Storing an image
http://blog.chinaunix.net/u2/69227/showart_2000436.html