Raw格式转换为Bmp格式

首先先介绍C++中图像数据分配内存方法。
 
在计算机中图像是一个二维的数字点阵。
比较容易想到的是申请一个二维矩阵来存储图像
如:
BYTE image[512][512];
可以存储一幅512*512个像素的图像,每个像素用一个字节表示,一个字节能表示0-255共256个不同取值。所以这一二维数组比较合适存储 灰度图像
 
对于 二维彩色图像,如果每个像素分别有R,G,B 3个颜色分量,则可以用如下的方式分配二维数组。
struct RGB{
BYTE r;
BYTE g;
BYTE b;
};
RGB image[512][512];
但是分配二维数组有一个致命缺点,就是不能分配占用空间较大的数组,如imgae【5000】【5000】。
 
所以,比较好的二维图像内存分配方法可用以下思想:
BYTE *imgae[5000];
for(int i=0;i<512;i++)
{
     image[i]=new unsigned char[5000];
}
,以上代码实际就是创建一个二维数组,image[i][j]表示二维数组的第i行第j列。存储图像第i行第j列个像素

 BMP文件组成分为:
{
HEADER
BITMAPFILEHEADER
BITMAPINFOHEADER
RGBQUAD
DATA
}
以下是将.RAW 文件转为.BMP格式的程序,
 
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int  main()
{
 FILE *fp;
 FILE *fp1;
 int imageW=512;
 int imageH=512;
 int storeW =imageW;
BITMAPFILEHEADER bh;
BITMAPINFOHEADER bInfo;//位图信息头


 int i=0;
 RGBQUAD rgb;
    unsigned char *image[1000];//image[i] is a point
// unsigned char[512];
 fp=fopen("f:\\lena.raw","rb");
 if(fp==NULL)
 {
  printf("open lena.raw failed\n");
  return 0;
 }
 //unsigned char *image[1000];//image[i] is a point
 for(i=0;i<512;i++)
 {
  //image[i]=new unsigned char[512];//
  image[i]=malloc(512);
  fread(image[i],1,512,fp);//every row read 512 word from fp
 }//after this the lena.raw's data is been read into image[][];
 fclose(fp);
 fp1=fopen("f:\\new.bmp","wb");
 if(fp1==NULL)
 {
  printf("open new.bmp failed\n");
  return 0;
 }
 
 
 if(storeW%4!=0)
 {
  storeW+=(4-storeW%4);//
 }
// BITMAPFILEHEADER bh;//位图头文件(包含有关文件类型,大小,存放位置等信息)
 bh.bfType=((WORD)('M'<<8)|'B');//"BM"说明文件类型
 bh.bfReserved1=0;//保留
 bh.bfReserved2=0;//保留
 bh.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256 + storeW*imageH;//文件大小
 bh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;
 //表示从头文件开始到实际图像数据数据之间的字节的偏移量。bfOffBits可以直接定位像素数据
 //BITMAPINFOHEADER bInfo;//位图信息头
 bInfo.biSize=sizeof(BITMAPINFOHEADER);//说明BITMAPINFOHEADER结构所需的字数
 bInfo.biWidth= imageW;//图像宽度,以像素为单位
 bInfo.biHeight=imageH;//图像高度,以像素为单位
 bInfo.biPlanes=1;//为目标设备说明位面数,其中总是被设为1
 bInfo.biBitCount=8;//说明比特数/像素的颜色深度,值为0,1,4,8,16,24或32,256灰度级的颜色深度为8,因为2^8=256
 bInfo.biCompression=BI_RGB;//说明图像数据压缩类型
 bInfo.biSizeImage=storeW*imageH;//说明图像的大小,一字节为单位,
 bInfo.biXPelsPerMeter=0;//水平分辨率,可以设为0
 bInfo.biYPelsPerMeter=0;//垂直分辨率,可以设为0
 bInfo.biClrUsed=256;//说明位图实际使用的彩色表中颜色索引数
 bInfo.biClrImportant=0;//说明对图像显示有重要影响的颜色索引数目,为0表示都重要。
 fwrite(&bh,sizeof(BITMAPFILEHEADER),1,fp1);//把位图头文件写入新建的bmp格式文件中
 fwrite(&bInfo,sizeof(BITMAPINFOHEADER),1,fp1);//位图信息头写入新建的bmp格式文件中
// RGBQUAD rgb;
 rgb.rgbReserved=0;
 for(i=0;i<256;i++)
 {
  rgb.rgbBlue=rgb.rgbRed=rgb.rgbGreen=i;
  fwrite(&rgb,sizeof(RGBQUAD),1,fp1);
 }
 for(i=0;i<256;i++)
 {
  fwrite(image[511-i],1,512,fp1);//把之前获取到的图片原始数据从imge中写入新建的bmp格式文件中
 }
 fclose(fp1);
 return 0 ;

}


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值