魔术教学硬币穿玻璃杯:C++位图操作

来源:百度文库 编辑:九乡新闻网 时间:2024/05/03 06:45:30
/**
*author:何金国。xiaoyanghuaban修改于2009.12.29. 
*/
#include
#include    //包括这个有文件 
int main() //void 也可以不要, 想想为什么
{
    FILE *fp=fopen("d:\\lena.raw","rb"); //打开原始图像文件lena.raw
    if(fp==NULL)
    {    printf("can not open lena.raw\n");     return 0; }
    unsigned char *image[1000];//image[i]是一个指针
    for(int i=0;i<512;i++)
    {
      image[i]=new unsigned char[512]; //申请512字节的内存空间, 把起始地址赋给image[i];
      fread(image[i],1,512, fp);//图像读入 
    }
    fclose(fp);//关闭图像 
    //可以考虑在此处加入图象处理函数
    FILE *fp1=fopen("d:\\new.bmp","wb");//创建新的图像 
    if(fp1==NULL)
 {  printf("can not open new.bmp");   return 0; }
   int imageW=512; //宽度 
   int imageH=512; //高度 
   int storeW=imageW;
   if (storeW%4!=0)
      storeW+=(4-storeW%4);//将storew变成4的整数倍,不够就凑上。 
   //==================================================
   //位图图像文件的基本格式:位图文件头、位图信息头、彩色表 、位图数据。一共四部分。 
   //******************************************* 
   BITMAPFILEHEADER bh; //位图头文件 
   bh.bfType = ((WORD)('M' << 8) | 'B');  // "BM" 或者ox4D42 ,文件的类型 
   bh.bfReserved1=0;//保留,必须设置为0 
   bh.bfReserved2=0;//保留,必须设置为0 
   bh.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256+storeW*imageH;
   //注意此处用storeW;-----文件的大小 ------需要留意此处的计算!!!!!!!!!!!!!!!!!!! 
   bh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;//这里的计算!!!! 
   /*从文件头开始到实际的图像数据之间的字节偏移量。
   这是由于位图信息头和调色把的长度会根据集体的情况而变化,使用这个部分可以直接定位图像数据*/ 
   //================================================
   BITMAPINFOHEADER bInfo;   //位图信息头 
   bInfo.biSize=sizeof(BITMAPINFOHEADER); //说明 BITMAPINFOHEADER所需要的字节 
   bInfo.biWidth=imageW;    //宽度 
   bInfo.biHeight=imageH;   // 高度 
   bInfo.biPlanes=1;        //目标设备的位面数,总是被设置为1 
   bInfo.biBitCount=8;      //说明比特/像素的颜色深度 ,表示2的多少次方种颜色 
   bInfo.biCompression=BI_RGB;      //图像的压缩类型 
   bInfo.biSizeImage=storeW*imageH; //图像的大小,以字节为单位。 
   bInfo.biXPelsPerMeter=0; //水平分辨率,0是一种简化问题的处理方法
   bInfo.biYPelsPerMeter=0; //垂直分辨率, 同上 
   bInfo.biClrUsed=256;     //说明位图实际使用的颜色表中的颜色索引数目,0表示所有的颜色数目 
   bInfo.biClrImportant=0;   //说明对图像有重要影响的颜色的索引数目,0表示都重要 
   //====================================================
   fwrite(&bh,sizeof(BITMAPFILEHEADER),1,fp1);//写入头文件 
   fwrite(&bInfo,sizeof(BITMAPINFOHEADER),1,fp1);//写入信息头 
   //=====================================================
   RGBQUAD rgb; //位图彩色表 具有颜色分量属性 
   rgb.rgbReserved=0; //保留设置为0 
   //*********************************************
   //==================================================
   for(int i=0;i<256;i++)
   {//写入彩色表
    rgb.rgbBlue=rgb.rgbRed=rgb.rgbGreen=i;//代表灰图图像 
    fwrite(&rgb,sizeof(RGBQUAD),1,fp1);   
   }
   for(int i=0;i<512;i++) 
   {//写入新的图像内容 
      //fwrite(image[511-i],1,512, fp1);//反向  输出 
      fwrite(image[i],1,512, fp1); //正向 输出 
   }
   fclose(fp1); 
}