本人最近刚开始学习相关知识,想自己编个程序实现如题功能,但编译后发现错误一大把。由于是初学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;
}