1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > RAW格式图像转为BMP格式

RAW格式图像转为BMP格式

时间:2018-09-28 13:13:11

相关推荐

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];/*申请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 ;

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。