c++图像处理

本文介绍了一个简单的程序,用于将原始的RAW图像文件转换成BMP格式,并详细解释了如何构建BMP文件的各个组成部分,包括位图文件头、位图信息头、彩色表等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
*author:何金国。xiaoyanghuaban修改于2009.12.29.
*/
#include <stdio.h>
#include <windows.h>   //包括这个有文件
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);
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值