0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux开发_介绍BMP图片上下翻转、添加水印

DS小龙哥-嵌入式技术 2022-09-17 15:43 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

【摘要】 介绍BMP图片上下翻转、添加水印、通过学习BMP图片结构学习文件编程

BMP图片练习文件操作(专题练习)

1.​BMP图片数据取模,模拟图片取模软件。(选择16位或者24位取模方式)

16位。

2.​BMP图片放大缩小,根据输入的尺寸放大缩小图片。

3.​实现图片4种翻转效果: 上、下、左、右。

4.​给图片的指定位置添加水印

要求: 在图片的任意位置,添加任意的文字水印。

比如: xxx路口 20181008 11:04

将字库加入: ASCII和中文GBK字库

​目录作业: 拷贝目录下所有文件(指定后缀的文件)到指定目录下,考虑一层目录。

多层目录拷贝。

​Makefile作业: 使用Makefile建立工程,只需要写一个Makefile文件。

(1)BMP图片上下翻转实现

#include 
#include 
#include 
#include 

/* 必须在结构体定义之前使用,这是为了让结构体中各成员按1字节对齐 */
#pragma pack(1)

/*需要文件信息头:14个字节 */
struct tagBITMAP_FILE_HEADER
{
	unsigned short bfType;   //保存图片类似。 'BM' -- 0x4d42
	unsigned int  bfSize;      //图片的大小
	unsigned short bfReserved1;
	unsigned short bfReserved2;
	unsigned int  bfOffBits;  //RGB数据偏移地址
};

/* 位图参数信息 */
struct tagBITMAP_INFO_HEADER { 
	unsigned long  biSize;      //结构体大小
	unsigned long  biWidth;		//宽度
	unsigned long  biHeight;	//高度
	unsigned short biPlanes;
	unsigned short biBitCount;	//颜色位数
	unsigned long  biCompression;
	unsigned long  biSizeImage;
	unsigned long  biXPelsPerMeter;
	unsigned long  biYPelsPerMeter;
	unsigned long  biClrUsed;
	unsigned long  biClrImportant;
};

/*
函数功能: BMP图片翻转
函数参数:
		char *src_BmpFile     :BMP图片源文件
		char *new_BmpFile     :新文件
返回值  :0表示成功,其他值失败
*/
int BMPOverturn(char *src_BmpFile,char *new_BmpFile)
{
	/*1. 打开源文件*/
	int err=0;
	FILE *bmp_file=fopen(src_BmpFile,"rb");
	if(bmp_file==NULL)
	{
		err=1;
		goto ERROR;
	}
	
	/*2. 图片参数获取*/
	struct tagBITMAP_FILE_HEADER src_head; //BMP文件头
	memset(&src_head,0,sizeof(struct tagBITMAP_FILE_HEADER));
	if(fread(&src_head,1,sizeof(struct tagBITMAP_FILE_HEADER),bmp_file)!=sizeof(struct tagBITMAP_FILE_HEADER))
	{
		err=2;
		goto ERROR;
	}
	
	if(src_head.bfType!=0x4d42) //判断类型
	{
		err=3;
		goto ERROR;
	}
	
	struct tagBITMAP_INFO_HEADER src_info; //BMP图像参数
	memset(&src_info,0,sizeof(struct tagBITMAP_INFO_HEADER));
	if(fread(&src_info,1,sizeof(struct tagBITMAP_INFO_HEADER),bmp_file)!=sizeof(struct tagBITMAP_INFO_HEADER))
	{
		err=4;
		goto ERROR;
	}
	
	if(src_info.biBitCount!=24) //判断颜色位数
	{
		err=5;
		goto ERROR;
	}
	
	/*3. 创建新图片*/
	FILE *new_file=fopen(new_BmpFile,"wb");
	if(new_file==NULL)
	{
		err=6;
		goto ERROR;
	}
	
	/*3.1 创建BMP文件头*/
	fwrite(&src_head,1,sizeof(struct tagBITMAP_FILE_HEADER),new_file);
	
	/*3.2 创建BMP图像参数*/
	fwrite(&src_info,1,sizeof(struct tagBITMAP_INFO_HEADER),new_file);

	/*3.3 实现图片上下翻转*/
	int i;
	int lineByte=src_info.biWidth*3; //一行总字节数量
	if(lineByte%4)lineByte++;
	
	int offset=lineByte*(src_info.biHeight-1)+src_head.bfOffBits;
	char *data_p=malloc(lineByte);
	if(data_p==NULL)
	{
		err=7;
		goto ERROR;
	}
	
	for(i=0;i;i++)>

(2)BMP图片水印添加

#include 
#include 
#include 
#include 

/* 必须在结构体定义之前使用,这是为了让结构体中各成员按1字节对齐 */
#pragma pack(1)

/*需要文件信息头:14个字节 */
struct tagBITMAP_FILE_HEADER
{
	unsigned short bfType;   //保存图片类似。 'BM' -- 0x4d42
	unsigned int  bfSize;      //图片的大小
	unsigned short bfReserved1;
	unsigned short bfReserved2;
	unsigned int  bfOffBits;  //RGB数据偏移地址
};

/* 位图参数信息 */
struct tagBITMAP_INFO_HEADER { 
	unsigned long  biSize;      //结构体大小
	unsigned long  biWidth;		//宽度
	unsigned long  biHeight;	//高度
	unsigned short biPlanes;
	unsigned short biBitCount;	//颜色位数
	unsigned long  biCompression;
	unsigned long  biSizeImage;
	unsigned long  biXPelsPerMeter;
	unsigned long  biYPelsPerMeter;
	unsigned long  biClrUsed;
	unsigned long  biClrImportant;
};

/*--  文字:  水  --*/
/*--  宋体42;  此字体下对应的点阵为:宽x高=56x56   --*/
const unsigned char font0[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,
0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,
0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,
0x7C,0x00,0x0C,0x00,0x00,0x00,0x00,0x7C,0x00,0x0E,0x00,0x00,0x00,0x00,0x7E,0x00,
0x1F,0x00,0x00,0x00,0x00,0x7E,0x00,0x3F,0x80,0x00,0x00,0x00,0x7E,0x00,0x7F,0xC0,
0x00,0x00,0x18,0x7E,0x00,0xFE,0x00,0x00,0x00,0x3C,0x7F,0x00,0xF8,0x00,0x1F,0xFF,
0xFE,0x7F,0x03,0xF0,0x00,0x0F,0xFF,0xFF,0x7F,0x87,0xC0,0x00,0x07,0x80,0x7E,0x7F,
0x8F,0x80,0x00,0x00,0x00,0x7C,0x7F,0x9F,0x00,0x00,0x00,0x00,0x7C,0x7F,0xFC,0x00,
0x00,0x00,0x00,0xF8,0x7D,0xF8,0x00,0x00,0x00,0x00,0xF8,0x7D,0xE0,0x00,0x00,0x00,
0x00,0xF8,0x7C,0xE0,0x00,0x00,0x00,0x01,0xF0,0x7C,0xF0,0x00,0x00,0x00,0x01,0xF0,
0x7C,0xF0,0x00,0x00,0x00,0x01,0xF0,0x7C,0x78,0x00,0x00,0x00,0x03,0xE0,0x7C,0x7C,
0x00,0x00,0x00,0x03,0xE0,0x7C,0x3C,0x00,0x00,0x00,0x07,0xC0,0x7C,0x3E,0x00,0x00,
0x00,0x07,0xC0,0x7C,0x1E,0x00,0x00,0x00,0x0F,0x80,0x7C,0x1F,0x00,0x00,0x00,0x0F,
0x80,0x7C,0x0F,0x80,0x00,0x00,0x1F,0x00,0x7C,0x0F,0xC0,0x00,0x00,0x1E,0x00,0x7C,
0x07,0xE0,0x00,0x00,0x3E,0x00,0x7C,0x03,0xE0,0x00,0x00,0x3C,0x00,0x7C,0x03,0xF0,
0x00,0x00,0x78,0x00,0x7C,0x01,0xFC,0x00,0x00,0xF8,0x00,0x7C,0x00,0xFE,0x00,0x00,
0xF0,0x00,0x7C,0x00,0xFF,0x00,0x01,0xE0,0x00,0x7C,0x00,0x7F,0xC0,0x03,0xC0,0x00,
0x7C,0x00,0x3F,0xE0,0x07,0x80,0x00,0x7C,0x00,0x1F,0xFC,0x0F,0x00,0x00,0x7C,0x00,
0x0F,0xFC,0x1E,0x00,0x00,0x7C,0x00,0x07,0xE0,0x1C,0x00,0x00,0x7C,0x00,0x03,0xC0,
0x38,0x00,0x7F,0xFC,0x00,0x01,0x80,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,
0x0F,0xFC,0x00,0x00,0x00,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0x00,0x00,0x01,0xF0,
0x00,0x00,0x00,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
/*--  文字:  印  --*/
/*--  宋体42;  此字体下对应的点阵为:宽x高=56x56   --*/
const unsigned char font1[]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x03,0xE0,
0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x00,0x00,
0x00,0x00,0x00,0xFF,0xE0,0x00,0x03,0x00,0x01,0x87,0xF8,0x03,0x80,0x03,0xC0,0x01,
0xFF,0xC0,0x03,0xFF,0xFF,0xE0,0x01,0xFC,0x00,0x03,0xFF,0xFF,0xE0,0x01,0xE0,0x00,
0x03,0xC0,0x07,0xC0,0x01,0xE0,0x00,0x03,0xC0,0x07,0xC0,0x01,0xE0,0x00,0x03,0xC0,
0x07,0xC0,0x01,0xE0,0x00,0x03,0xC0,0x07,0xC0,0x01,0xE0,0x00,0x03,0xC0,0x07,0xC0,
0x01,0xE0,0x00,0x03,0xC0,0x07,0xC0,0x01,0xE0,0x00,0x03,0xC0,0x07,0xC0,0x01,0xE0,
0x00,0x03,0xC0,0x07,0xC0,0x01,0xE0,0x00,0x03,0xC0,0x07,0xC0,0x01,0xE0,0x00,0x03,
0xC0,0x07,0xC0,0x01,0xE0,0x03,0x03,0xC0,0x07,0xC0,0x01,0xE0,0x07,0x83,0xC0,0x07,
0xC0,0x01,0xFF,0xFF,0xC3,0xC0,0x07,0xC0,0x01,0xFF,0xFF,0xE3,0xC0,0x07,0xC0,0x01,
0xE0,0x00,0x03,0xC0,0x07,0xC0,0x01,0xE0,0x00,0x03,0xC0,0x07,0xC0,0x01,0xE0,0x00,
0x03,0xC0,0x07,0xC0,0x01,0xE0,0x00,0x03,0xC0,0x07,0xC0,0x01,0xE0,0x00,0x03,0xC0,
0x07,0xC0,0x01,0xE0,0x00,0x03,0xC0,0x07,0xC0,0x01,0xE0,0x00,0x03,0xC0,0x07,0xC0,
0x01,0xE0,0x00,0x03,0xC0,0x07,0xC0,0x01,0xE0,0x00,0x03,0xC0,0x07,0xC0,0x01,0xE0,
0x00,0x03,0xC0,0x07,0xC0,0x01,0xE0,0x00,0x73,0xC0,0x07,0xC0,0x01,0xE0,0x03,0xF3,
0xC0,0x07,0xC0,0x01,0xE0,0x3F,0x83,0xC0,0x07,0xC0,0x01,0xE1,0xFE,0x03,0xC7,0xFF,
0xC0,0x01,0xFF,0xF0,0x03,0xC1,0xFF,0xC0,0x03,0xFF,0xC0,0x03,0xC0,0x7F,0x80,0x03,
0xFF,0x00,0x03,0xC0,0x1F,0x00,0x01,0xFC,0x00,0x03,0xC0,0x0E,0x00,0x01,0xF0,0x00,
0x03,0xC0,0x00,0x00,0x00,0xE0,0x00,0x03,0xC0,0x00,0x00,0x00,0x40,0x00,0x03,0xC0,
0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,
0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,
0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x03,
0xC0,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
/*
函数功能: 针对BMP图片实现的画点函数
函数参数:
	char *bmp_mem  :表示BMP图片RGB颜色数据的首地址
	int x
	int y
	int color	   :画点的颜色值
	
	BMP_DrawPoint(bmp_mem,100,100,0);
*/
unsigned int bmp_Width; //保存BMP图片的宽度
void BMP_DrawPoint(unsigned char *bmp_mem,int x,int y,int color)
{
	unsigned char *rgb=(unsigned char *)(bmp_mem+y*bmp_Width*3+x*3);
	*rgb=color>>0&0xFF;
	*(rgb+1)=color>>8&0xFF;
	*(rgb+2)=color>>16&0xFF;
}

/*
函数功能: 在BMP图片的指定位置添加字符串
说明: 传入的取模字体必须是8的倍数(宽度和高度是相等)
*/
void BMP_ShowString(unsigned char *bmp_mem,unsigned char *font,int x,int y,int size,int color)
{
	int i,j;
	int x0=x;
	unsigned char data;
	for(i=0;i

学习Makefile

1.​学习什么是目标文件: 该如何定义

2.​学习什么是目标依赖文件:该如何定义

3.​Makefile本身推导规则: 如何根据目标和目标依赖文件去进行编译生成目标。

4.​学习特殊变量的定义和功能使用: VPATH\ CC\ CFLAGS

5.​条件判断语句、常用的几个函数 $(Shell ls)。

6.​自动化编译的符号: $@ $< $^ %

make <参数> -n表示调试不编译 -s 隐藏命令的输出

关于make命令运用时传递的参数:

make abc=123 app -ns

Shell脚本编程

Shell脚本: 是一个编程语言(脚本类型的编程语言、解释类型编程语言)

变量、for循环、while循环、if语言、switch语句、函数….

​Linux开发: 侧重于驱动开发、侧重于运维开发。

;i++)>
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • BMP
    BMP
    +关注

    关注

    0

    文章

    48

    浏览量

    17694
  • Makefile
    +关注

    关注

    1

    文章

    125

    浏览量

    20202
  • Shell脚本
    +关注

    关注

    0

    文章

    36

    浏览量

    8451
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【免费送书】成为硬核Linux开发者:《Linux 设备驱动开发(第 2 版)》

    Linux系统的设备驱动开发,一直给人门槛较高的印象,主要因内核机制抽象、需深度理解硬件原理、开发调试难度大所致。2021年,一本讲解驱动开发的专著问世即获市场青睐,畅销近万册——这便
    的头像 发表于 11-18 08:06 464次阅读
    【免费送书】成为硬核<b class='flag-5'>Linux</b><b class='flag-5'>开发</b>者:《<b class='flag-5'>Linux</b> 设备驱动<b class='flag-5'>开发</b>(第 2 版)》

    基于开源鸿蒙的图片编辑开发样例(2)

    本期内容介绍基于开源鸿蒙在RK3568上开发图片编辑样例的全流程,分为上篇和下篇,本篇为下篇,主要介绍标记、保存图片功能。
    的头像 发表于 10-31 09:19 2790次阅读
    基于开源鸿蒙的<b class='flag-5'>图片</b>编辑<b class='flag-5'>开发</b>样例(2)

    基于开源鸿蒙的图片编辑开发样例(1)

    本期内容介绍基于开源鸿蒙在RK3568上开发图片编辑样例的全流程,分为上篇和下篇,本篇为上篇,主要介绍添加相册图片、编译
    的头像 发表于 10-31 09:16 2774次阅读
    基于开源鸿蒙的<b class='flag-5'>图片</b>编辑<b class='flag-5'>开发</b>样例(1)

    ElfBoard技术贴|如何在【RK3588】ELF 2开发板用户空间更换开机Logo

    传统修改开发板开机Logo的方式需要重新编译内核,流程复杂且耗时。本文介绍了一种创新方案:通过预先在存储中划分专用的Logo分区,允许用户直接在文件系统中更新Logo图片文件,这极大地简化了定制流程
    的头像 发表于 10-29 11:12 982次阅读
    ElfBoard技术贴|如何在【RK3588】ELF 2<b class='flag-5'>开发</b>板用户空间更换开机Logo

    创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—Linux-RT应用开发案例

    Linux-RT 性能;还提供 rt_gpio_ctrl(实时线程控制 LED 翻转)、rt_input(实时线程监听按键触发 LED)两个开发案例,含测试、编译步骤与关键代码,为评估板 L
    的头像 发表于 09-25 17:25 561次阅读
    创龙 瑞芯微 RK3588 国产2.4GHz八核 工业<b class='flag-5'>开发</b>板—<b class='flag-5'>Linux</b>-RT应用<b class='flag-5'>开发</b>案例

    RK3506开发Linux开发板极致性价比之选

    RK3506开发Linux开发板极致性价比之选瑞芯微RK3506开发板,3核Cortex-A7@1.5GHz+Cortex-M0,Linux
    的头像 发表于 09-11 16:26 2824次阅读
    RK3506<b class='flag-5'>开发</b>板<b class='flag-5'>Linux</b><b class='flag-5'>开发</b>板极致性价比之选

    Linux 应用开发手册

    T507linux应用开发手册
    发表于 08-22 17:01 10次下载

    产品图片上传API接口

    ​ 在电商平台、内容管理系统或移动应用中,产品图片上传API接口是核心功能之一。它允许用户或第三方应用通过HTTP请求将图片文件上传到服务器,实现产品图像的快速添加和管理。本文将逐步介绍
    的头像 发表于 07-25 14:30 483次阅读
    产品<b class='flag-5'>图片</b>上传API接口

    鸿蒙5开发宝藏案例分享---一多开发实例(图片美化)

    ?【鸿蒙开发宝藏案例分享】一次搞定多端适配的图片美化应用开发思路!? Hey小伙伴们~ 今天在翻鸿蒙文档时挖到一个超实用的大宝藏!原来官方早就悄悄提供了超多\"一多开发\"的实战
    发表于 06-03 16:09

    在官网上下载的在linux之下使用的canmvide如何安装?

    在官网上下载的在linux之下使用的canmvide如何安装,有没有安装手册呢? 期待结果和实际结果
    发表于 04-29 06:24

    [迅为]Linux开发小技巧:Remote - SSH插件

    [迅为]Linux开发小技巧:Remote - SSH插件
    的头像 发表于 04-01 15:46 950次阅读
    [迅为]<b class='flag-5'>Linux</b><b class='flag-5'>开发</b>小技巧:Remote - SSH插件

    DLP4500能否上传一组图片,然后给正向触发,每次触发就投影一张图片

    求教DLP 4500能否上传一组912*1140分辨率的bmp图片,然后给正向触发,每次触发投影一张图片? 如果可以,如何操作,user‘s guide貌似没看到这种操作。附件为其中一张bm
    发表于 02-27 07:28

    Spire.Cloud.Word云端Word文档处理SDK介绍

    添加书签,添加文本和图片水印,设置背景颜色和背景图片添加 Word 数字签名,
    的头像 发表于 02-11 11:11 797次阅读
    Spire.Cloud.Word云端Word文档处理SDK<b class='flag-5'>介绍</b>

    《DNESP32S3使用指南-IDF版_V1.6》第四十章 图片显示实验

    第四十章图片显示实验 在开发产品的时候,很多时候,我们都会用到图片解码,在本章中,我们将向大家介绍如何通过ESP32-S3来解码BMP/JP
    发表于 01-04 09:22

    RZ T2H PCIe裸机程序开发Linux下的配置介绍

    ,还提供2个PCIe Gen3通道等高速外设。本文主要介绍PCIe外设的功能、裸机下EP模式的程序开发、以及在Linux下,如何编译网卡的流程。
    的头像 发表于 12-18 11:14 2498次阅读
    RZ T2H PCIe裸机程序<b class='flag-5'>开发</b>和<b class='flag-5'>Linux</b>下的配置<b class='flag-5'>介绍</b>