1、bmp格式介绍

bmp格式图片里实际存储的也是RGB原始数据,可以分为8bit、16bit、24bit、32bit的bmp格式,也就是指bmp图片中保存的RGB是用8bit、16bit、24bit、32bit来表示。简单理解就是在原始RGB的数据前面加bmp文件头,文件头里会说明保存的RGB的位数、宽高、文件大小等信息。更多bmp格式的细节参考博客:https://blog.csdn.net/aidem_brown/article/details/80500637

2、bmp格式的注意点

(1)保存的RGB原始数据,排列方式是BGR、BGR······格式;
(2)保存的RGB图像是倒立的,是从下往上一行一行保存的;
(3)RGB数据的一行长度要4字节对齐。比如:宽是102,那每行数据是102*3=306,这时候要向上对齐,每行是308,对的两个字节用0填充。

3、代码思路

(1)把RGB图像转换成BGR、BGR排列顺序;
(2)把BGR数据旋转180度,需要得到倒立的BGR图像;
(2)根据BGR图像的宽、高等信息构建bmp文件头;
(3)将bmp文件头、BGR数据依次写入到xxx.bmp文件中,得到bmp格式的图像;

4、实现代码

#define align(value, align)   ((( (value) + ( (align) - 1 ) ) \/ (align) ) * (align) )//BMP文件头(14字节)
typedef struct                       /**** BMP file header structure ****/
{  unsigned int   bfSize;           /* Size of file */  unsigned short bfReserved1;      /* Reserved */  unsigned short bfReserved2;      /* ... */  unsigned int   bfOffBits;        /* Offset to bitmap data */
} BITMAPFILEHEADER; //位图信息头(40字节)
typedef struct                       /**** BMP file info structure ****/
{  unsigned int   biSize;           /* Size of info header */  int            biWidth;          /* Width of image */  int            biHeight;         /* Height of image */  unsigned short biPlanes;         /* Number of color planes */  unsigned short biBitCount;       /* Number of bits per pixel */  unsigned int   biCompression;    /* Type of compression to use */  unsigned int   biSizeImage;      /* Size of image data */  int            biXPelsPerMeter;  /* X pixels per meter */  int            biYPelsPerMeter;  /* Y pixels per meter */  unsigned int   biClrUsed;        /* Number of colors used */  unsigned int   biClrImportant;   /* Number of important colors */
} BITMAPINFOHEADER;  /*******************************************************************************
* 函数名  : BGR888_TO_BMP
* 描  述  : 将BGR888格式的图片转换成bmp格式
* 输  入  : dstLength --输出BMP数据的缓存空间长度
*             bgrbuf    --BGR888数据,需要倒立的图像
*             width     --BGR图像的宽
*             height    --BGR图像的高
* 输  出  : dst   --保存BMP图像
* 返回值    : 成功返回 0
*          失败返回 -1
*******************************************************************************/
int BGR888_TO_BMP(char *dst, int dstLength, unsigned char *bgrbuf,int width,int height)
{  BITMAPFILEHEADER bfh;  BITMAPINFOHEADER bih;  int i = 0, row_align;if(dstLength < width * height * 3 + 54){printf("dst buffer is too small!\n");return OSA_EFAIL;}//bmp的每行数据的长度要4字节对齐row_align = align(width * 3, 4);unsigned short bfType=0x4d42;    //'BM'             bfh.bfReserved1 = 0;  bfh.bfReserved2 = 0;  bfh.bfSize = 2 + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + row_align * height;  bfh.bfOffBits = 2 + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);  bih.biSize = sizeof(BITMAPINFOHEADER);  bih.biWidth = width;  bih.biHeight = height;  bih.biPlanes = 1;  bih.biBitCount = 24;  bih.biCompression = 0;  bih.biSizeImage = 0;  bih.biXPelsPerMeter = 0;  bih.biYPelsPerMeter = 0;  bih.biClrUsed = 0;  bih.biClrImportant = 0;  memset(dst, 0, dstLength);memcpy(dst, &bfType, sizeof(bfType));memcpy(dst + sizeof(bfType), &bfh, sizeof(bfh));memcpy(dst + sizeof(bfType) + sizeof(bfh), &bih, sizeof(bih));for(i = 0; i < height; i++){memcpy(dst + sizeof(bfType) + sizeof(bfh) + sizeof(bih) + row_align * i, bgrbuf + width * 3 * i, width * 3);}return 0;
}

C语言实现RGB888转BMP格式图片功能相关推荐

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

    开发过程中有时候需要解析bmp数据,下面先简单介绍bmp数据组成,后面附上C语言读取和存储bmp格式图片代码. 典型的位图文件格式通常包含下面几个数据块: BMP文件头:保存位图文件的总体信息. 位图 ...

  2. c语言将两幅bmp格式图片拼接图片

    要将两幅 BMP 格式图片拼接在一起,你需要先打开这两幅图片并读取它们的像素数据.然后,你可以使用每幅图片的像素数据来创建一个新的图像,将两幅图片的像素数据拼接在一起.最后,你可以使用 BMP 文件格 ...

  3. 将BMP 格式图片转换为 JPEG 格式【c语言】

    源码链接: https://blog.csdn.net/qq_44394952/article/details/122587475?spm=1001.2014.3001.5502. 一.任务及目标 利 ...

  4. C语言读取BMP格式图片

    C语言读取BMP格式图片 BMP 维基百科,自由的百科全书 汉漢▼ 位图 扩展名 .bmp 开发者 Microsoft 格式 图像文件格式  本文介绍的是一种图像文件格式. 关于Unicode的第1区 ...

  5. c语言实现pdf显示图片,C语言读取BMP格式图片.pdf

    C语言读取BMP格式图片 C 语言读取BMP 格式图片 以下摘自维基百科,自由的百科全书 BMP 取自位图BitMaP 的缩写,也称为DIB (与设备无关的位图)是微软视窗图形 子系统(Graphic ...

  6. 将BMP 格式图片转换为 JPEG 格式【c语言源码】

    原理及代码讲解链接: https://blog.csdn.net/qq_44394952/article/details/122587306?spm=1001.2014.3001.5502. 主函数m ...

  7. 【数字图像处理】一.MFC详解显示BMP格式图片

    本文主要是讲述<数字图像处理>系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的<数字图像处理>课程和以前的项目叙述讲解 ...

  8. MFC详解显示BMP格式图片

    本文主要是讲述<数字图像处理>系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的<数字图像处理>课程和以前的项目叙述讲解 ...

  9. Python 使用 opencv 库将BMP格式图片转RAW

    一.安装库的问题 代码中导入包名如下 import cv2 但是 Python Interpreter 应该搜索 opencv-python ,直接搜索 cv2 安装不了 二.代码示例 import ...

最新文章

  1. 安利7款珍藏已久的windows软件,每一个都非常强大
  2. python入门教程2word-入门干货:Python操作Word文件经验分享
  3. bzoj1007[HNOI2008]水平可见直线
  4. oracle 操作树大全,oracle树查询语句
  5. 31.javaweb简介
  6. Ambari实现HTTPS登陆
  7. IOS图标 HTML规范,IOS用户界面(UI)设计规范图表——APP设计师必看!
  8. 概率与计算机论文,数学概率统计论文范文
  9. 总结: 1.函数 2.函数调用 3.函数的参数
  10. 腾讯裁员内幕:顶层反思推动,PCG与CSIG影响最大
  11. 一個簡單的不能再簡單的技巧。。。好吧。。css恩。。定位於window 給 IE6+
  12. java-php-python-springboot网络办公系统计算机毕业设计
  13. 发射功率 接收灵敏度 RF射频传输 原理 介绍 三分钟看懂 详解!
  14. 新网站链接提交入口攻略
  15. delphi xe7 EMS是什么 什么作用,怎么使用?
  16. 基于微信评选投票小程序系统设计与实现 开题报告
  17. 点餐系统,餐厅点餐系统,外卖点餐系统python计算机毕业设计
  18. React使用高德地图 (react-amap)(一)
  19. 不足100克按100克C语言,C语言_第3章.ppt
  20. Echarts( Pie,Bar)数据可视化 条形图,柱图,饼图、时间轴代码 JS-NEW

热门文章

  1. 18001 Farmer Cat
  2. 监测DNS服务器状态手动修复,电脑管家修复不了DNS配置_修复DNS技巧-高达阁杀毒软件站...
  3. cas113995-55-4/花菁染料1,1,2-三甲基-1H-苯并吲哚-7-磺酸
  4. 共享软件走向海外之路
  5. 未来的计算机辅助教学是什么样的,计算机辅助教学cat是什么软件
  6. webuploader上传文件夹
  7. 几个技术虚拟小组会议的思考
  8. IGBT器件选型参考
  9. 智能食谱管理系统3.02
  10. python用户名和密码登录_Python爬虫带用户名密码登录