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 ;
}

 

raw转bmp

int saveRawToBmp(uint8_t *pBuf, int32_t width, int32_t height, const char *pFileName) { char hea...
  • hanmengaidudu
  • hanmengaidudu
  • 2017年09月04日 17:14
  • 142

raw格式图片转换为bmp格式

  • 2009年10月13日 17:05
  • 1.33MB
  • 下载

C++ 读取raw文件并保存为到bmp图片下

上篇文章,写了如何读取光谱图片raw,本文就解决,如何把保存的像素值保存为BMP图片格式。    关于bmp文件格式,网上有很多,不再赘述。我们需要做的只是修改相关信息头,然后填充数据就可以了,本代...
  • as784089306
  • as784089306
  • 2017年10月15日 17:01
  • 334

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

改进:不再从参考图像读调色板,程序内部创建调色板 #include "stdio.h" #include "Windows.h" unsigned char *pBmpBuf;//读入图像数据...
  • lichengyu
  • lichengyu
  • 2011年02月18日 22:38
  • 3439

RAW格式图像转化为bmp

  • 2015年12月20日 09:44
  • 22KB
  • 下载

C语言将raw data(rgb/rgba)写成bmp文件(bmp24或32)

int bmp_write(unsigned char *image, int xsize, int ysize, char *filename) {    unsigned char header[...
  • cq520zw
  • cq520zw
  • 2009年08月12日 23:20
  • 1569

可跨平台的写BMP文件方法(linux 和windows)

方法一:        void SaveImage(char *file,unsigned char* bmp,int w ,int h,int position) { int i = 0...
  • yumulinxiang
  • yumulinxiang
  • 2016年11月15日 00:02
  • 526

bmp转换成raw格式: bmp2raw

  • 2011年10月19日 11:47
  • 12KB
  • 下载

c++读取.raw格式图像

第一次接触用c++进行图像处理,首先就是对于裸格式.RAW的图片进行处理,在网上也是找了很久,但是都没有合适的,知识搜集到一些信息,就是说.raw是8位二进,,很好处理,然后就没有搜集到更多的信息了,...
  • sweet_dew
  • sweet_dew
  • 2014年11月03日 22:22
  • 2974

利用opencv将raw转换为rgb

最近工作中碰到将.raw格式文件转换为彩图格式文件。待转换的.raw格式文件不带有图像的宽高等信息,只有图像像素值信息,利用opencv接口无法直接读取。网上查的方法都无法满足我的需求,经过各种尝试终...
  • zhenhai308
  • zhenhai308
  • 2017年07月09日 21:10
  • 1743
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RAW格式图像转为BMP格式
举报原因:
原因补充:

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