关闭

RAW格式图像转为BMP格式

标签: imagefp存储bytenullstruct
8269人阅读 评论(5) 收藏 举报

首先先介绍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 ;
}

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:290539次
    • 积分:3066
    • 等级:
    • 排名:第11811名
    • 原创:35篇
    • 转载:52篇
    • 译文:0篇
    • 评论:71条
    最新评论