RAW格式图像转为BMP格式

原创 2012年03月25日 22:33:01

首先先介绍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];/*申请5000字节的内存空间,把起始地址赋给image[i]*/

}

以上代码实际就是创建一个二维数组,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 ;
}

 

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

为raw数据添加图像头,并保存为bmp图像(改进)

改进:不再从参考图像读调色板,程序内部创建调色板 #include "stdio.h" #include "Windows.h" unsigned char *pBmpBuf;//读入图像数据...

raw转bmp

int saveRawToBmp(uint8_t *pBuf, int32_t width, int32_t height, const char *pFileName) { char hea...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

raw2bmp

#include //基本输入输出的定义,包括文件的输入输出。控制台的输入输出, //不包括cout对象,cout是面向对象的设计,其定义在iostream头文件中 #include //...
  • T_W_S
  • T_W_S
  • 2012年12月18日 21:48
  • 883

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

QDataStream写文件操作-writeBytes与writeRawData区别

Qt提供了非常方便的写文件操作QDataStream,可以使用流式操作来对数据进行读写,但Qt提供如此强大的功能的同时,也会付出一些额外的开销,在默认的流式写操作时,会附加一些Qt独有的数据内容,在这...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RAW格式图像转为BMP格式
举报原因:
原因补充:

(最多只允许输入30个字)