Git地址:
https://gitee.com/whik/bmp_gen_c_and_verilog/tree/master/c
BMP文件格式详解参考:

  • Verilog实现生成BMP文件(BMP文件格式,二进制文件读写)
  • BMP文件格式详解
  • C语言生成BMP文件

C语言实现生成BMP,注意宽度必须进行4字节对齐,使用0来补充,否则部分宽度图片生成乱码。可使用PhotoShop生成宽度10,长度5的图片验证,数据存储为BMP文件最后一行为图片第一行的像素数据。先选择图像->模式->8位/通道,再保存为BMP,Windows,24Bit。使用联合体实现大小端转换。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>/*
https://blog.csdn.net/nibiewuxuanze/article/details/78805763
按小端字节序来存储,且宽度数据必须成4字节对齐。
图像数据区也不例外,按每行图像的数据字节,按4字节对齐。图像数据按行倒序存放,先存储最后一行图像数据,然后依次存放,直到第一行数据。
这样设计,可能是为了从文件尾部往前读的时候,能够直接顺序读出图像数据吧。
*/
typedef union {uint8_t bytes[4];uint32_t value;
}LITTLE;/** @fileName: bmp file name: test.bmp* @width   : bmp pixel width: 32bit* @height  : bmp pixel width: 32bit* @color   : R[8]/G[8]/B[8]* @note    : BMP is l endian mode*/
int bmp_gen_test(char *fileName, uint32_t width, uint32_t height, uint32_t color)
{FILE *fp;uint32_t i, j;LITTLE l_width, l_height, l_bfSize, l_biSizeImage;uint8_t r = color >> 16;uint8_t g = color >> 8;uint8_t b = color;uint32_t width_r  =  (width * 24 / 8 + 3) / 4 * 4;uint32_t bfSize = width_r * height + 54 + 2;uint32_t biSizeImage = width_r * height;l_width.value = width;l_height.value = height;l_bfSize.value = bfSize;l_biSizeImage.value = biSizeImage;/* BMP file format: www.cnblogs.com/wainiwann/p/7086844.html */uint8_t bmp_head_map[54] = {/* bmp file header: 14 byte */0x42, 0x4d,// bmp pixel size: width * height * 3 + 54l_bfSize.bytes[0], l_bfSize.bytes[1], l_bfSize.bytes[2], l_bfSize.bytes[3],0, 0 , 0, 0,54, 0 , 0, 0,    /* 14+40=54 *//* bmp map info: 40 byte */40, 0, 0, 0,//widthl_width.bytes[0], l_width.bytes[1], l_width.bytes[2], l_width.bytes[3],//heightl_height.bytes[0], l_height.bytes[1], l_height.bytes[2], l_height.bytes[3],1, 0,24, 00,             /* 24 bit: R[8]/G[8]/B[8] */0, 0, 0, 0,     //biCompression:0
//        0, 0, 0, 0,     //biSizeImage锛欰2 00 00 00=162l_biSizeImage.bytes[0], l_biSizeImage.bytes[1], l_biSizeImage.bytes[2], l_biSizeImage.bytes[3],0, 0, 0, 0,     //biXPelsPerMeter: 60 0F 00 000, 0, 0, 0,     //biYPelsPerMeter0, 0, 0, 0,     //biClrUsed0, 0, 0, 0      //biClrImportant};/* write in binary format */fp = fopen(fileName, "wb+");if(fp == NULL){printf("%s: file create failed!\n", fileName);return -1;}printf("%s: file create success!\n", fileName);fwrite(bmp_head_map, sizeof(bmp_head_map), 1, fp);for(i = 0; i < height; i++) {for(j = 0; j < width; j++)fprintf(fp, "%c%c%c", b, g, r); /* BGR *///4 byte alignfor(j = 0; j < width_r-width*3; j++)fprintf(fp, "%c", 0);}fprintf(fp, "%c%c", 0, 0); //PhotoShop two byte "0"if(fclose(fp)){printf("file close failed!\n");return -1;}fp = NULL;printf("width: %d\n", width);printf("height: %d\n", height);printf("R:%d, G:%d, B:%d or #%06x\n", r, g, b, color);return 0;
}int main(int argc, char *argv[])
{int ret;char bmpName[200];char *name = "test";uint32_t width = 951;uint32_t height = 511;uint32_t color = 0x563412;/* generate bmp file name */sprintf(bmpName, "%s_%d_%d_0x%06x.bmp", name, width, height, color);printf("bmpName: %s\n", bmpName);ret = bmp_gen_test(bmpName, width, height, color);if(!ret)system(bmpName);system("pause");return 0;
}

生成的test_951_511_0x563412.bmp

Git地址:
https://gitee.com/whik/bmp_gen_c_and_verilog/tree/master/c

C语言实现生成BMP图片文件(BMP文件格式,二进制文件读写)相关推荐

  1. 通过c语言访问bmp图片文件修改图片信息

    在c语言中访问设定路径下的bmp图片文件,修改图片中像素RGB信息,从而达到修改图片中颜色的目的. 本程序实现的是将原图片中蜡笔小新的眼睛和嘴巴改了. #include <head.h> ...

  2. C实现几种对BMP图片文件的处理

    #C实现几种对BMP图片文件的处理 ##什么是BMP文件? BMP(全称Bitmap-File)是Windows操作系统中的一种标准的图像文件格式,能够被多种Windows应用程序所支持.随着Wind ...

  3. Unity 读取1-bit bmp图片文件

    由于unity本身不支持直接从文件中去读取bmp,如果不应用System.Drawing去读取bmp文件是分厂麻烦的事情.由于项目原因,不能引入这个dll,又要读取这样1-bit的黑白色的二维码图片, ...

  4. 让 Android 可以识别BMP图片文件,且目前Android所支持的所有图片格式

      在Android自带到图片浏览器中,默认是不支持BMP格式的图片文件到,通过修改源码使得它支持BMP文件. Android 的图片编码解码是由 Skia 图形库负责的,Skia 通过挂接第三方开源 ...

  5. [Android] 针对生成的图片文件在系统Gallery不显示的处理

    之前遇到过一个问题,就是发现我在程序中生成一个新的 Bitmap 之后,当我打开系统的 Gallery 查看时,并没有看到新生成的图像.然而打开文件浏览器,找到保存 Bitmap 所在的文件夹下,还能 ...

  6. R语言单独保存输出图片文件

    1.图片文件保存输出 jpeg(file = "style.jpg") ##在当前目录下创建图片 plot(iris[,1],col="red") ## 画图程 ...

  7. qfile 创建文件_Qt之二进制文件读写

    点击上方"Qt学视觉",选择"星标"公众号重磅干货,第一时间送达 想要学习的同学们还请认真阅读每篇文章,相信你一定会有所收获 除了文本文件之外,其他需要按照一定 ...

  8. 单片机读取SD卡中BMP图片文件并送往TFT彩屏上显示(测试成功)(二)

    二.软件部分 软件中INI_FLAG为设置的一个标志位,通过置1该位可以控制发送或接受数据速度.因为在初始化阶段SD卡操作需要适当放缓,而初始化成功后可以加快数据传动速率. 1>往SD卡写一个字 ...

  9. C++实现红外Fir谱图文件转BMP图片文件

    1.红外图谱文件 红外图谱文件由文件头和温度数据两部分组成,其中文件头 64 个字节,其余字节为温度数据. 如下如: 每个像素用两个字节表示温度(16 位有符号短整数),低字节在前,高字节在后,温度数 ...

最新文章

  1. barrier linux,Linux系统上启用barrier?
  2. QImage 与 cv::Mat 之间的相互转换
  3. Boost:清理cleanup测试程序
  4. mysql触发器 多个条件_当条件为真时,如何使用MySQL触发器更新多个表?
  5. java bitmap jar_Java面试中常用的BitMap代码
  6. python开发应用程序错误_Python 程序员经常犯的 10 个错误
  7. java订单类_基于Java创建一个订单类代码实例
  8. Leetcode每日一题:121.best-time-to-buy-and-sell-stock(买股票的最佳时机)
  9. c++重载、覆盖和隐藏
  10. Android 学习笔记【基础扫盲篇】
  11. 软件行业渠道的价值在哪里?
  12. 1.thinkphp6配置文件详解
  13. 查看文件的MD5 值
  14. Spring Boot layered(分层) jar 构建docker镜像
  15. 好家伙?阿里网盘的分享功能已经出来了?
  16. APP平台是怎样实现视频加密呢?
  17. div html 下边加横线_css字体下边横线 html超链接更改颜色和去掉下划线
  18. 无理数存在性的几何证明
  19. windows的由来与详细介绍
  20. 最新版java(JDK-14)下载及安装

热门文章

  1. 计蒜客 腾讯的一笔画游戏
  2. 踔厉奋发·勇毅前行 | 2023广和通中国区代理商大会成功召开
  3. abp框架学习入门总结
  4. oracle初识007 序列+同义词
  5. 西瓜书-机器学习5.5 其他常见神经网络- RBF网络
  6. ubantu 黑屏_策魂三国游戏出现黑屏怎么处理 处理方案一览
  7. vscode-journal:vscode中写日记/便签/提醒,配合nutstore与安卓、ios同步
  8. OTA--卡刷全包、差分升级包制作、分析(代码摘自Google)---2
  9. 【软件测试】2021年软件测试领域常用工具总结(1)-抓包工具与单元测试工具篇
  10. 2023 号码归属地查询API接口PHP源码