C++实现bmp格式图像读写

bmp格式图像有一个特点就是这类数据被分为四个部分:

1.位图文件头(Bitmap File Header) ,大小:14字节

主要包括位图文件大小和位图文件类型信息

2.位图信息头(Bitmap Info Header),大小:40字节

主要包括:位图的宽度和高度,像素为单位、每个像素所占位数(1黑白图像),(4-16色图)、(8-256色图)、(24-真彩色图),新的BMP格式可以支持32位色。 还有其它水平和垂直分辨力(单位:像素/米)等

3.颜色表(Color Map),大小:4个字节

三大类:蓝色分量、绿色分量、红色分量

4.位图数据(Data Body)

对于2色位图用1位就可以表示该像素,那么1个字节就可以储存8个像素的颜色值

对于16色位图,用4个字节表示一个像素颜色,那么一个字节可以储存2个像素颜色值

对于256色位图,1个字节刚好储存1个像素的颜色值

对于真彩色位图,则需要3个字节才能表示一个像素的颜色值

1.读bmp图像

bool readBmp(char *bmpName)
{
 //二进制读方式打开指定的图像文件
    FILE *fp=fopen(bmpName,"rb");
 if(fp==0) return 0;

 //跳过位图文件头结构BITMAPFILEHEADER
 fseek(fp, sizeof(BITMAPFILEHEADER),0);

 //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
 BITMAPINFOHEADER head;
 fread(&head, sizeof(BITMAPINFOHEADER), 1,fp); 

 //获取图像宽、高、每像素所占位数等信息
 bmpWidth = head.biWidth;
 bmpHeight = head.biHeight;
 biBitCount = head.biBitCount;

 //定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
 int lineByte=(bmpWidth * biBitCount/8+3)/4*4;

 //灰度图像有颜色表,且颜色表表项为256
 if(biBitCount==8){
  //申请颜色表所需要的空间,读颜色表进内存
  pColorTable=new RGBQUAD[256];
  fread(pColorTable,sizeof(RGBQUAD),256,fp);
 }

 //申请位图数据所需要的空间,读位图数据进内存
 pBmpBuf=new unsigned char[lineByte * bmpHeight];
 fread(pBmpBuf,1,lineByte * bmpHeight,fp);

 //关闭文件
 fclose(fp);

 return 1;
}

2.写bmp图像

bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height,
    int biBitCount, RGBQUAD *pColorTable)
{
 //如果位图数据指针为0,则没有数据传入,函数返回
 if(!imgBuf)
  return 0;

 //颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0
 int colorTablesize=0;
 if(biBitCount==8)
  colorTablesize=1024;

 //待存储图像数据每行字节数为4的倍数
 int lineByte=(width * biBitCount/8+3)/4*4;

 //以二进制写的方式打开文件
 FILE *fp=fopen(bmpName,"wb");
 if(fp==0) return 0;

 //申请位图文件头结构变量,填写文件头信息
 BITMAPFILEHEADER fileHead;
 fileHead.bfType = 0x4D42;//bmp类型

 //bfSize是图像文件4个组成部分之和
 fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
  + colorTablesize + lineByte*height;
 fileHead.bfReserved1 = 0;
 fileHead.bfReserved2 = 0;

 //bfOffBits是图像文件前三个部分所需空间之和
 fileHead.bfOffBits=54+colorTablesize;

 //写文件头进文件
 fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);

 //申请位图信息头结构变量,填写信息头信息
 BITMAPINFOHEADER head;
 head.biBitCount=biBitCount;
 head.biClrImportant=0;
 head.biClrUsed=0;
 head.biCompression=0;
 head.biHeight=height;
 head.biPlanes=1;
 head.biSize=40;
 head.biSizeImage=lineByte*height;
 head.biWidth=width;
 head.biXPelsPerMeter=0;
 head.biYPelsPerMeter=0;
 //写位图信息头进内存
 fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);

 //如果灰度图像,有颜色表,写入文件
 if(biBitCount==8)
  fwrite(pColorTable, sizeof(RGBQUAD),256, fp);

 //写位图数据进文件
 fwrite(imgBuf, height*lineByte, 1, fp);

 //关闭文件
 fclose(fp);

 return 1;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 利用C/C++二进制读写png文件的方法示例

    前言 二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件.因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件. 对二进制文件的操作也需要先打开文件,用完后要关闭文件.在打开时要用ios::binary指定为以二进制形式传送和存储.二进制文件除了可以作为输入文件或输出文件外,还可以是既能输入又能输出的文件.这是和ASCII文件不同的地方. 需求 最近为了弄OpenGl的纹理代码,发现书上没有图片像素

  • C++实现bmp格式图像读写

    bmp格式图像有一个特点就是这类数据被分为四个部分: 1.位图文件头(Bitmap File Header) ,大小:14字节 主要包括位图文件大小和位图文件类型信息 2.位图信息头(Bitmap Info Header),大小:40字节 主要包括:位图的宽度和高度,像素为单位.每个像素所占位数(1黑白图像),(4-16色图).(8-256色图).(24-真彩色图),新的BMP格式可以支持32位色. 还有其它水平和垂直分辨力(单位:像素/米)等 3.颜色表(Color Map),大小:4个字节

  • 使用Nibabel库对nii格式图像的读写操作

    因为后期主要的研究方向是医学图像处理,而现有手头的大部分数据都是nii格式或者是hdr,img格式的数据,所以首先第一步我们需要解决图像的读写问题. 其实使用OpenCV也可以方便的进行图像读取,但是这里暂时只学习Nibabel这个库,后面有时间的话再研究OpenCV在python中的使用. Nibabel的安装 可以通过pip进行安装 pip install nibabel 简单的图像读取和存储操作 import os import nibabel as nib # 读取图像 path='C:

  • 关于图片存储格式的整理(BMP格式介绍)

    BMP BMP(全称Bitmap)是Window操作系统中的标准图像文件格式 可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广. 它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大.BMP文件的图像深度可选lbit.4bit.8bit及24bit.BMP文件存储数据时,图像的扫描方式是按从左到右.从下到上的顺序.由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都

  • C++针对bmp格式解析实例

    本文实例讲述了C++针对bmp格式解析的方法,分享给大家供大家参考.具体方法如下: 写这代码时,容易出现如下错误: 1. 忘了on_wm_paint()  一直在界面上画不出来 2. 正确写法 复制代码 代码如下: BYTE* pBits = (BYTE*)lpBase + pbitmapFileHeader->bfOffBits; 写成了 复制代码 代码如下: BYTE* pBits =  pbitmapFileHeader->bfOffBits; 这里主要是用了前面一篇中的CWnd框架.

  • Android中把bitmap存成BMP格式图片的方法

    最近的项目,做图片的另存为功能,需要把图片存成jpg,png,bmp.对于jpg和png来说相对简单,android提供了bitmap.compress()方法可以马上解决.但是对于BMP这种格式,没有很好的支持.我花了几天时间在网上找了很久,都没有找到有用的答案,同样也发了疑问,没有合适的解答. package com.test.bitmap; import java.io.FileNotFoundException; import java.io.FileOutputStream; impo

  • matlab 生成.bmp格式的文件

    生成.bmp格式的文件 .bmp格式的图片是未压缩的图片,相比于.raw格式,需要加上头文件.下面以大小为M*N的图片为例,说明头文件格式和内容. M = 128; N = 128; % 构造头文件 fileMemory = bmpHeadTrans(M*N+1078); wMemory = bmpHeadTrans(M); hMemory = bmpHeadTrans(N); imgMemory = bmpHeadTrans(M*N); head_bmp = [66; 77; %头文件 0x4

  • 利用python实现.dcm格式图像转为.jpg格式

    如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import numpy as np import os def Dcm2jpg(file_path): #获取所有图片名称 c = [] names = os.listdir(file_path) #路径 #将文件夹中的文件名称与后边的 .dcm分开 for name in names: index = name.

  • Python图像读写方法对比

    1  实验标准 因为训练使用的框架是Pytorch,因此读取的实验标准如下: 1.读取分辨率都为1920x1080的5张图片(png格式一张,jpg格式四张)并保存到数组. 2.将读取的数组转换为维度顺序为CxHxW的Pytorch张量,并保存到显存中(我使用GPU训练),其中三个通道的顺序为RGB. 3.记录各个方法在以上操作中所耗费的时间.因为png格式的图片大小差不多是质量有微小差异的jpg格式的10倍,所以数据集通常不会用png来保存,就不比较这两种格式的读取时间差异了. 写入的实验标准

  • C语言读取和存储bmp格式图片

    开发过程中有时候需要解析bmp数据,下面先简单介绍bmp数据组成,后面附上C语言读取和存储bmp格式图片代码. 典型的位图文件格式通常包含下面几个数据块: 1.BMP文件头:保存位图文件的总体信息. 2.位图信息头:保存位图图像的详细信息.位图信息:保存位图图像的详细信息. 3.调色板:保存所用颜色的定义.调色板:保存所用颜色的定义. 4.位图数据:保存一个又一个像素的实际图像.位图数据:保存一个又一个像素的实际图像. 1. BMP文件头(14字节) BMP文件头数据结构含有BMP文件的类型.文

  • delphi实现将BMP格式图形转化为JPG格式图形的方法

    本文实例讲述了delphi实现将BMP格式图形转化为JPG格式图形的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: procedure ConvertBMPtoJPG(SFileName,DFileName:string); Var   J:TJpegImage;   I:TBitmap;   S,D:String; begin   s:=SFileName;   d:=DFileName;   J:=TJpegImage.Create;   I:=TBitmap.Crea

随机推荐