C语言实现RGB888转BMP格式图片功能

2023-11-07

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;
}  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言实现RGB888转BMP格式图片功能 的相关文章

  • 手动将 RGB 转换为灰度

    我想手动将 RGB 图像转换为灰度图像 而无需在张量流中使用库 所以我写了以下内容 import tensorflow as tf import matplotlib image as mpimg import matplotlib pyp
  • 使用 matlab/octave 将图像从 rgb 转换为 hsv 回 rgb

    我正在尝试将彩色图像从 RGB 转换为 HSV 进行更改 然后再转换回 RGB 作为测试 我编写此代码只是为了测试如何从 rgb 到 hsv 返回到 rgb 但是当我查看图像时 它只是显示为黑色 我缺少什么 PS我使用的是octave 3
  • 为什么 RGB 使用 6 个十六进制数字?

    据我所知 RGB 用两个十六进制数字编码颜色 对应于红色 绿色和蓝色分量 例如 ff0000 是纯红色 据我了解 每个十六进制数字代表 0 15 之间的数字 或 4 位信息 但是如何用 32 位来表示每种颜色呢 为什么使用两位数字表示红色
  • 解压在中间停止并且输出文件填充零(黑色像素)?

    我正在尝试对 bmp 位图 文件应用 DCT 离散余弦变换 压缩 我有一个在 Turbo C 中运行的 c 文件 这实际上并不是压缩 但我试图实现 DCT 和 IDCT 代码如下 the image to be compressed is
  • 获取 RGB 颜色并使用 iPhone 上的 UIColor 对其进行标准化

    我正在寻找一种直接的方法来从 RGB 转换颜色 从 Photoshop 等工具中获取它 然后将其转换为 UIColor 由于 UIColor 对每个颜色空间使用 0 0 到 1 0 的标准化色域 因此我不确定这是如何完成的 感谢您的解决方案
  • 在 Python 中将图像中的颜色映射到颜色列表中最接近的成员

    我有一个 19 种颜色的列表 它是一个大小为 numpy 的数组 19 3 colors np array 0 0 0 0 0 255 255 0 0 150 30 150 255 65 255 150 80 0 170 120 65 12
  • java 缓冲图像:检测黑色像素

    我有这个简单的代码来浏览 24 位彩色 Windows bmp 文件 BufferedImage mapa BMPDecoder read new File maps map bmp final int xmin mapa getMinX
  • 使用 Windows 成像组件 (WIC) 的 Delphi 2007

    我需要在Delphi 2007中读取一些大约1 7mb的图片并将其从jpg转换为bmp 有些图片被剪切 灰度或转换后最差 我进行了搜索 但没有找到在 delphi 2007 中添加像 TWicImage 这样的 WIC 例程的技巧 我在某处
  • 在 JavaScript 中检测图像大部分是深色还是浅色?

    我正在寻找一种方法来扫描任何给定的图像并确定它是否大部分是暗的或亮的 在明亮鲜艳的颜色或暗且不饱和的颜色的意义上 这是用 PHP 完成的 背景图片深色还是浅色 https stackoverflow com questions 584244
  • 什么是 XPS 文件以及如何使用它

    我有一个简单的 C net Web 应用程序 我正在使用 XPS 文件 我使用了以下代码 private void button1 Click object sender EventArgs e try string xpsFile D C
  • java中RGB转灰度、bmp图像

    我的老师给我们布置了一个任务 要制作一个采用 640x480 bmp 彩色图像的课程 将其转换为灰度图像 我找到了一些有想法的资源 所以我做到了 但是有一个问题 因为它似乎使它不会给我错误 但输出没有出现 我认为这是我的代码 我的代码是 i
  • 在 Android 上如何从位图获取 RGB 值?

    我想在 Android 上获取位图的 RGB 值 但目前还无法做到这一点 我的目标是获取位图每个像素的 RGB 值 Android 或其他有什么特定的功能吗 我也想知道我需要colorMatrix 功能 这对我的项目非常重要 这可能有点晚了
  • 如何设置 BufferedImage 中的 RGB 像素以显示 16 位深度的 PNG?

    我正在尝试读取并显示 PNG 文件 我处理 8 位深度的图像没有问题 我按如下方式进行 BufferedImage result new BufferedImage width height BufferedImage TYPE INT R
  • 将专用 NV12 视频帧转换为 RGB

    我有一个使用 Android MediaCodec 解码的 H264 流 当我查询输出 MediaFormat 时 颜色格式为 2141391875 显然 这是一种专门的 NV12 变体 称为 HAL PIXEL FORMAT NV12 A
  • 如何将 mat 转换为 array2d

    我为dlib http dlib net face landmark detection ex cpp html那里的面部地标代码使用 array2d 来获取图像 但我喜欢使用 Mat 读取图像并转换为 array2d 因为 dlib 仅支
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • PHP HSV 到 RGB 公式理解

    我可以转换RGB价值观HSV使用以下代码 r r 255 g g 255 b b 255 h 0 s 0 v 0 min min min r g b max max max r g b r max min v max if r 0 h 0
  • 计算热图颜色

    我正在制作一个由 HTML 表格组成的热图 该表包含n细胞并有一个lowest值和一个highest值 最高值始终高于最低值 每个细胞都有一个cell价值 所有这些值都是整数 具有最低值的单元格应为浅蓝色 缩放到具有最高值的单元格为深红色
  • 将 RGB 转换为灰度/强度

    当从 RGB 转换为灰度时 据说应该对 R G 和 B 通道应用特定的权重 这些权重是 0 2989 0 5870 0 1140 据说这是因为人类对这三种颜色的感知 感受不同 有时也有人说这些是用于计算 NTSC 信号的值 但是 我在网上没
  • tesseract 处理后无法获取原始彩色位图 - android

    我使用 android 的 tesseract 库从图像中捕获某些文本 我知道捕获的图像不会保存在任何地方 它会被回收 我需要找到原始的彩色位图 我一直在尝试找到原始的彩色位图 但我所能找到的只是灰度位图 Bitmap bitmap act

随机推荐

  • UDP包传送字符串实现方法以及方格乱码的出现原因和解决办法

    在使用socket发送udp包传输文本时 由于包中的char型数组是定长的 且其长度大于消息长度 所以其中必有很多空元素 当接收端接收到udp包时进行转码 空元素就会被转码成方块形状的乱码 解决办法 每条消息发送完毕后添加 作为记号 接收后
  • 浏览器渲染机制 (二)浏览器主进程-浏览器内核-浏览器渲染流程

    文章目录 浏览器主进程和浏览器渲染进程的通信过程 浏览器内核 渲染进程 中线程之间的管理 GUI渲染线程与JS引擎线程互斥 JS阻塞页面加载 WebWorker JS的多线程 WebWorker与SharedWorker 总结浏览器渲染流程
  • adb通过网络连接

    1 使用USB数据线连接设备 2 在命令行输入adb tcpip 5555 5555为端口号 可以自由指定 3 断开 USB数据 此时可以连接你需要连接的 USB设备 4 再计算机命令行输入 adb connect lt 设备的IP地址 g
  • 自动计算30天内的股价最高价源代码

    我可以回答这个问题 您可以使用以下代码来计算30天内股价的最高价 复制 import pandas as pd import yfinance as yf 设置股票代码和日期范围 symbol AAPL start date 2021 01
  • Python绝技:运用Python成为顶级黑客

    Python 是一门常用的编程语言 它不仅上手容易 而且还拥有丰富的支持库 对经常需要针对自己所 处的特定场景 以极少的代码量实现所需的功能 Python绝技 运用Python成为顶级黑客结合具体的场景和真 实的案例 详述了 Python
  • 《软件测试的艺术》第三章 代码检查、走查和评审

    软件测试的艺术 第三章 代码检查 走查和评审 3 1 代码检查与走查 3 2 代码检查 3 2 1 代码检查小组 3 2 2 检查议程与注意事项 3 2 3 对事不对人 和人有关的注意事项 3 2 4 代码检查的衍生功效 3 3 用于代码检
  • 100个python算法超详细讲解:农夫过河

    100个python算法超详细讲解 谷哥技术 1 问题描述 一个农夫在河边带了一匹狼 一只羊和一棵白菜 他需要把这三样东西用 船带到河的对岸 然而 这艘船只能容下农夫本人和另外一样东西 如果农夫 不在场的话 狼会吃掉羊 羊也会吃掉白菜 请编
  • 鸿蒙内核阅读笔记-定时器

    鸿蒙内核阅读笔记 定时器 简介 核心模块 定时器 los swtmr c 介绍 阅读代码 函数部分 简介 近期在阅读鸿蒙liteOS a 由于是初次探索内核的奥秘 将一些阅读的心得进行分享 希望能在作为笔记的同时 也能帮助更多人学习 感谢图
  • springboot + eureka集群,实现注册中心,实现负载均衡

    搭建eureka集群 新建一个boot项目 File new project 如图选择 next 起名字如下 gt next finish 新建3个注册中心 以三个注册中心为例 想多的自己加 项目名字上 new module next 起名
  • Basic Level 1055 集体照 (25分)

    题目 拍集体照时队形很重要 这里对给定的 N 个人 K 排的队形设计排队规则如下 每排人数为 N K 向下取整 多出来的人全部站在最后一排 后排所有人的个子都不比前排任何人矮 每排中最高者站中间 中间位置为 m 2 1 其中 m 为该排人数
  • PowerDesigner安装步骤和打印错误

    1 解压 2 双击运行安装包 等待初始化 3 初始化完成后点击next 4 选择地区 同意协议 完成后点击next 5 选择安装位置 完成后点击next 6 选择要安装的组件 eclipse我不需要 需要可以勾选并配置 完成后点击next
  • pandas apply使用多列计算生成新的列

    在python数据分析中 有时需要根据多列数据生成中间结果 pandas给我们带来了很多方便 通常简短的代码可以实现一些高级功能 灵活掌握一些技巧可以事倍功半 pandas的apply方法用于对指定列的每个元素进行相同的操作 下面生成一个d
  • 静态代码分析工具清单:开源篇(各语言)

    本文是一个静态代码分析工具的清单 共有26个工具 包括4个 NET工具 2个Ada工具 7个C 工具 4个Java工具 2个JavaScript工具 1个Opa工具 2个Packaging工具 3个Perl工具 1个Python工具 1 N
  • Python——列表排序和赋值

    1 列表排序 列表排序方法 ls sort 对列表ls 中的数据在原地进行排序 ls 13 5 73 4 9 ls sort ls sort reverse False 默认升序 reverse True 降序 ls 13 5 73 4 9
  • Mysql备份工具xtraback全量和增量测试

    Mysql备份工具xtraback全量和增量测试 xtrabackup 是 percona 的一个开源项目 可以热备份innodb XtraDB 和MyISAM 会锁表 官方网址http www percona com docs wiki
  • 系统运维日常工作有哪些,应该具备哪些技能

    一 日常工作内容 看监控 网站流量 CDN流量 看邮件有没有普通业务监控报警 看有家中有没有其他需要做的工作 处理报警 查看报警的原因 和开发一起解决 并且尽量找出避免再次发生的方法 例如添加一些定时清理脚本 处理发布 基本都是自动化 但是
  • 使用tab键分割的文章能快速转换成表格。( )_Word教程:最常用的 7 个 Tab 键用法,瞅一眼就会了...

    Tab键一直是键盘上 不起眼 的一个按键 平时很多人可能不会去碰触这个键 实际上 它有很多实用的功能 如果用好了 可以大大提高我们的操作效率 01 段首空两格 写文章时 通常段首需要空两格 许多人会直接敲空格 这种操作是很Low的 其实 你
  • git cherry-pick apply-merge 任意commit(s)

    文章目录 必杀技 困惑 cherry pick 必杀技 是什么让Git 从众多版本控制系统中脱颖而出 独领风骚 当然是其分支模型 正因如此 人称分支模型为Git的 必杀技 如果不能熟练的运用Git的分支技巧 那就远离了Git的精华 困惑 我
  • zabbix配置微信报警

    如有错误 敬请谅解 此文章仅为本人学习笔记 仅供参考 如有冒犯 请联系作者删除 6 1 注册企业微信 企业微信注册地址 https work weixin qq com 设置总部门名称添加成员 也可以成员扫码加入 点击 成员加入 过程略 6
  • C语言实现RGB888转BMP格式图片功能

    1 bmp格式介绍 bmp格式图片里实际存储的也是RGB原始数据 可以分为8bit 16bit 24bit 32bit的bmp格式 也就是指bmp图片中保存的RGB是用8bit 16bit 24bit 32bit来表示 简单理解就是在原始R