* 音视频入门文章目录 *

RGB-TO-BMP 回顾

将 RGB 数据转成 BMP 图片:

  1. 了解 BMP 文件格式
  2. 准备 BMP 文件头信息
  3. 准备 BMP 信息头
  4. BMP 存储 RGB 的顺序是 B-G-R
  5. BitmapInfoHeader 中的 biHeight 字段,biHeight 为正,位图自底向顶扫描,biHeight 为负,位图自顶向底扫描。
  6. BMP 图像四字节对齐

实际开发过程,通常会使用第三方开源库来简化开发,屏蔽一些底层的复杂度,节省大量编写代码的时间。

使用开源库的方式

libbmp (C 库)

#include <stdio.h>
#include "libbmp/libbmp.h" // 彩虹的七种颜色
u_int32_t rainbowColors[] = {
0XFF0000, // 红
0XFFA500, // 橙
0XFFFF00, // 黄
0X00FF00, // 绿
0X007FFF, // 青
0X0000FF, // 蓝
0X8B00FF // 紫
}; int main() {
int width = 711, height = 711;
bmp_img img;
bmp_img_init_df (&img, width, height); for (int i = 0; i < width; ++i) {
// 当前颜色
u_int32_t currentColor = rainbowColors[0];
if(i < 100) {
currentColor = rainbowColors[0];
} else if(i < 200) {
currentColor = rainbowColors[1];
} else if(i < 300) {
currentColor = rainbowColors[2];
} else if(i < 400) {
currentColor = rainbowColors[3];
} else if(i < 500) {
currentColor = rainbowColors[4];
} else if(i < 600) {
currentColor = rainbowColors[5];
} else if(i < 700) {
currentColor = rainbowColors[6];
}
// 当前颜色 R 分量
u_int8_t R = (currentColor & 0xFF0000) >> 16;
// 当前颜色 G 分量
u_int8_t G = (currentColor & 0x00FF00) >> 8;
// 当前颜色 B 分量
u_int8_t B = currentColor & 0x0000FF;
for (int j = 0; j < height; ++j) {
bmp_pixel_init (&img.img_pixels[i][j], R, G, B);
}
} bmp_img_write (&img, "/Users/staff/Desktop/test-libbmp.bmp");
bmp_img_free (&img);
return 0;
}

google libbmp(C 库)

#include <stdio.h>
#include "google/libbmp/src/bmpfile.h" // 彩虹的七种颜色
u_int32_t rainbowColors[] = {
0XFF0000, // 红
0XFFA500, // 橙
0XFFFF00, // 黄
0X00FF00, // 绿
0X007FFF, // 青
0X0000FF, // 蓝
0X8B00FF // 紫
}; int main(int argc, char **argv) { int width = 711, height = 711;
bmpfile_t *bmp;
if ((bmp = bmp_create(width, height, 24)) == NULL) {
return -1;
} for (int i = 0; i < width; ++i) {
// 当前颜色
u_int32_t currentColor = rainbowColors[0];
if(i < 100) {
currentColor = rainbowColors[0];
} else if(i < 200) {
currentColor = rainbowColors[1];
} else if(i < 300) {
currentColor = rainbowColors[2];
} else if(i < 400) {
currentColor = rainbowColors[3];
} else if(i < 500) {
currentColor = rainbowColors[4];
} else if(i < 600) {
currentColor = rainbowColors[5];
} else if(i < 700) {
currentColor = rainbowColors[6];
}
// 当前颜色 R 分量
u_int8_t R = (currentColor & 0xFF0000) >> 16;
// 当前颜色 G 分量
u_int8_t G = (currentColor & 0x00FF00) >> 8;
// 当前颜色 B 分量
u_int8_t B = currentColor & 0x0000FF; rgb_pixel_t pixel = {B, G, R, 0};
for (int j = 0; j < height; ++j) {
bmp_set_pixel(bmp, j, i, pixel);
}
} bmp_save(bmp, "/Users/staff/Desktop/test-google-libbmp.bmp");
bmp_destroy(bmp);
return 0;
}

bmp(C 库)

#include <stdio.h>
#include "bmp/bmp.h" // 彩虹的七种颜色
u_int32_t rainbowColors[] = {
0XFF0000, // 红
0XFFA500, // 橙
0XFFFF00, // 黄
0X00FF00, // 绿
0X007FFF, // 青
0X0000FF, // 蓝
0X8B00FF // 紫
}; int main() { int width = 711, height = 711;
char bmp[BMP_SIZE(width, height)];
bmp_init(bmp, width, height); for (int i = 0; i < width; ++i) { // 当前颜色
u_int32_t currentColor = rainbowColors[0];
if(i < 100) {
currentColor = rainbowColors[0];
} else if(i < 200) {
currentColor = rainbowColors[1];
} else if(i < 300) {
currentColor = rainbowColors[2];
} else if(i < 400) {
currentColor = rainbowColors[3];
} else if(i < 500) {
currentColor = rainbowColors[4];
} else if(i < 600) {
currentColor = rainbowColors[5];
} else if(i < 700) {
currentColor = rainbowColors[6];
} for (int j = 0; j < height; ++j) {
bmp_set(bmp, j, i, currentColor);
}
} FILE *f = fopen("/Users/hubin/Desktop/test-bmp.bmp", "wb");
fwrite(bmp, sizeof(bmp), 1, f);
fclose(f);
return 0;
}

qdbmp(C 库)

#include <stdio.h>
#include "qdbmp/qdbmp.h" // 彩虹的七种颜色
u_int32_t rainbowColors[] = {
0XFF0000, // 红
0XFFA500, // 橙
0XFFFF00, // 黄
0X00FF00, // 绿
0X007FFF, // 青
0X0000FF, // 蓝
0X8B00FF // 紫
}; int main() {
int width = 711, height = 711;
BMP* bmp = BMP_Create(width, height, 24); for (int i = 0; i < width; ++i) {
// 当前颜色
u_int32_t currentColor = rainbowColors[0];
if(i < 100) {
currentColor = rainbowColors[0];
} else if(i < 200) {
currentColor = rainbowColors[1];
} else if(i < 300) {
currentColor = rainbowColors[2];
} else if(i < 400) {
currentColor = rainbowColors[3];
} else if(i < 500) {
currentColor = rainbowColors[4];
} else if(i < 600) {
currentColor = rainbowColors[5];
} else if(i < 700) {
currentColor = rainbowColors[6];
}
// 当前颜色 R 分量
u_int8_t R = (currentColor & 0xFF0000) >> 16;
// 当前颜色 G 分量
u_int8_t G = (currentColor & 0x00FF00) >> 8;
// 当前颜色 B 分量
u_int8_t B = currentColor & 0x0000FF;
for (int j = 0; j < height; ++j) {
BMP_SetPixelRGB(bmp, j, i, R, G, B);
}
} /* Save result */
BMP_WriteFile( bmp, "/Users/hubin/Desktop/test-qdbmp.bmp");
BMP_CHECK_ERROR( stderr, -2 ); /* Free all memory allocated for the image */
BMP_Free( bmp );
return 0;
}

easybmp(C++ 库)

#include "EasyBMP/EasyBMP.h"
using namespace std; // 彩虹的七种颜色
u_int32_t rainbowColors[] = {
0XFF0000, // 红
0XFFA500, // 橙
0XFFFF00, // 黄
0X00FF00, // 绿
0X007FFF, // 青
0X0000FF, // 蓝
0X8B00FF // 紫
}; int main( int argc, char* argv[]) { int width = 711, height = 711;
int bitDepth = 24; BMP bmp;
bmp.SetSize(width, height);
bmp.SetBitDepth(bitDepth); for (int i = 0; i < width; ++i) {
// 当前颜色
u_int32_t currentColor = rainbowColors[0];
if(i < 100) {
currentColor = rainbowColors[0];
} else if(i < 200) {
currentColor = rainbowColors[1];
} else if(i < 300) {
currentColor = rainbowColors[2];
} else if(i < 400) {
currentColor = rainbowColors[3];
} else if(i < 500) {
currentColor = rainbowColors[4];
} else if(i < 600) {
currentColor = rainbowColors[5];
} else if(i < 700) {
currentColor = rainbowColors[6];
}
// 当前颜色 R 分量
u_int8_t R = (currentColor & 0xFF0000) >> 16;
// 当前颜色 G 分量
u_int8_t G = (currentColor & 0x00FF00) >> 8;
// 当前颜色 B 分量
u_int8_t B = currentColor & 0x0000FF; RGBApixel pixel;
pixel.Red = R;
pixel.Green = G;
pixel.Blue = B;
pixel.Alpha = 0;
for (int j = 0; j < height; ++j) {
bmp.SetPixel(j, i, pixel);
}
} bmp.WriteToFile("/Users/hubin/Desktop/test-easybmp.bmp"); return 0;
}

bitmap(C++ 库)

#include "bitmap/bitmap_image.hpp"

using namespace std;

// 彩虹的七种颜色
u_int32_t rainbowColors[] = {
0XFF0000, // 红
0XFFA500, // 橙
0XFFFF00, // 黄
0X00FF00, // 绿
0X007FFF, // 青
0X0000FF, // 蓝
0X8B00FF // 紫
}; int main() { int width = 711, height = 711; bitmap_image image(width, height);
image.clear(); for (int i = 0; i < width; ++i) {
// 当前颜色
u_int32_t currentColor = rainbowColors[0];
if(i < 100) {
currentColor = rainbowColors[0];
} else if(i < 200) {
currentColor = rainbowColors[1];
} else if(i < 300) {
currentColor = rainbowColors[2];
} else if(i < 400) {
currentColor = rainbowColors[3];
} else if(i < 500) {
currentColor = rainbowColors[4];
} else if(i < 600) {
currentColor = rainbowColors[5];
} else if(i < 700) {
currentColor = rainbowColors[6];
}
// 当前颜色 R 分量
u_int8_t R = (currentColor & 0xFF0000) >> 16;
// 当前颜色 G 分量
u_int8_t G = (currentColor & 0x00FF00) >> 8;
// 当前颜色 B 分量
u_int8_t B = currentColor & 0x0000FF; for (int j = 0; j < height; ++j) {
image.set_pixel(j, i, R, G, B);
}
} image.save_image("/Users/hubin/Desktop/test-bitmap.bmp"); return 0;
}

查看开源库的效果

六个开源库都可以大大减少我们的工作量!


代码:

rgb-to-bmp

参考资料:

libbmp

google libbmp

bmp

qdbmp

easybmp

bitmap

内容有误?联系作者:


最新文章

  1. 类js效果
  2. C#GDI+图像处理
  3. JAVA ,Map接口 ,迭代器Iterator
  4. 微博一键分享主要通过对指定 URL 添加各种参数来实现;
  5. LA 2031
  6. mysql数据库常用语句
  7. javascript复制
  8. VS路宏 vc++于OutDir、ProjectDir、SolutionDir不同的路径
  9. PHP中使用正则表达式详解 preg_match() preg_replace() preg_mat
  10. Codeforces #377 Div2
  11. 对float的理解
  12. COM学习(一)——COM基础思想
  13. 【转】JavaScript的三种消息框alert,confirm,prompt
  14. pg_restore数据库恢复指令
  15. [转]webpack中require和import的区别
  16. unittest单元测试框架
  17. Beta阶段团队成员贡献分分配规则
  18. luogu 4158 粉刷匠 dp套dp
  19. 检测三种不同操作系统的Bash脚本
  20. unity3d常用组件及分析

热门文章

  1. 在Oracle Sql Developer中查看oracle版本
  2. fork 可能导致subprocess崩溃
  3. Springboot配置文件获取系统环境变量的值
  4. python获取风和天气城市数据 ID
  5. osgViewer
  6. Django Timezone 处理
  7. FastDFSClient工具类
  8. if判断用法
  9. (二十三)IDEA 构建一个springboot工程,以及可能遇到的问题
  10. window.open post传参