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

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

3天内不再提示

Linux开发_文件目录操作介绍、创建BMP图片

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

扫码添加小助手

加入工程师交流群

【摘要】 介绍C语言文件编程,创建BMP图片,BMP图片结构介绍,介绍目录接口编程,Makefile知识点。

任务1: 文件操作函数学习

​学习两套函数:

(1)​C语言下标准文件操作函数。fopen、fclose、fread、fwrite (适合操作普通文件)

针对文件指针操作。

(2)​Linux下专用的文件操作函数。open、close、read、write (适合操作设备文件、也可以操作普通文件)

针对文件描述符操作。

​如何检测文件是否读取到结尾? 判断读函数的返回值。

​文件操作相关的练习作业

1.​(编码)创建一张BMP图片,颜色可以指定。

2.​模拟du命令,可以查看指定文件的大小,可以将文件大小打印出来。

3.​文件加密和解密。 密码: 数字方式、字符串方式

(1)​加密方式: 异或加密

扩展: 加密方式: MD5加密

扩展作业: 实现文件的压缩和解压,模拟tar命令。

创建BMP图片:

#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 *name 文件名称
		int w 宽度
		int h 高度
		int c 颜色位数
函数返回值: 0表示成功
*/
int CreateBmpImage(char *name,int w,int h,int c)
{
	/*1. 创建文件*/
	FILE *file=fopen(name,"wb");
	if(file==NULL)return 1;
	
	/*2. 创建BMP文件头*/
	struct tagBITMAP_FILE_HEADER head;
	memset(&head,0,sizeof(struct tagBITMAP_FILE_HEADER));
	head.bfType=0x4d42; //BMP图片的类型
	head.bfSize=sizeof(struct tagBITMAP_FILE_HEADER)+sizeof(struct tagBITMAP_INFO_HEADER)+w*h*3;
	head.bfOffBits=sizeof(struct tagBITMAP_FILE_HEADER)+sizeof(struct tagBITMAP_INFO_HEADER);
	if(fwrite(&head,1,sizeof(struct tagBITMAP_FILE_HEADER),file)!=sizeof(struct tagBITMAP_FILE_HEADER))
	{
		return 2;
	}
	
	/*3. 创建BMP图像参数信息*/
	struct tagBITMAP_INFO_HEADER info;
	memset(&info,0,sizeof(struct tagBITMAP_INFO_HEADER));
	info.biSize=sizeof(struct tagBITMAP_INFO_HEADER);
	info.biWidth=w;
	info.biHeight=h;
	info.biBitCount=24;
	info.biPlanes=1;
	if(fwrite(&info,1,sizeof(struct tagBITMAP_INFO_HEADER),file)!=sizeof(struct tagBITMAP_INFO_HEADER))
	{
		return 3;
	}
	
	/*4. 图片颜色数据填充*/
	int i,j;
	for(i=0;i;i++)>

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

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

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

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

文件系统:

1.​文件系统本身就是一套上层(软件层)算法,底层有与硬件交互的接口。

硬件: 磁盘、U盘、SD卡 (扇区)…….

2.​文件本身属于一个容器,没有规定存放什么类型的数据。

3.​文件指针(光标位置),会随着读写函数移动。

4.​文件读写权限: 打开文件需要选择正确的权限。

​文件格式介绍:

图片: BMP、PNG、JPG/JPEG、GIF、ICO

音频/视频: MP3、MP4

文本: txt(字符串)

文档: doc

​Main函数传递参数

#include

int main(int argc,char **argv)

{

//argc :表示参数的数量

//argv :二维指针,指向传入的每一个字符串首地址

int i;

for(i=0;i;i++)<>

{

printf("argv[%d]=%s\n",i,argv[i]);

}

return 0;

}

目录过滤:

#include 
#include 
#include 
#include 
#include 

// ./app  <.mp3>

/*
函数功能: 输出指定目录下指定指定后缀的文件名称+路径
./app /bmp/jpg/ .mp3
*/
int PrintDirName(char *DirName,char *str)
{
	/*1. 打开目录*/
	DIR *dirp=opendir(DirName);
	if(dirp==NULL)return 1;
	
	/*2. 循环读取目录*/
	struct dirent *file_p=NULL;
	char *findstr=NULL;
	char *addr_p=NULL; //存放最终完整的文件名称
	while(file_p=readdir(dirp))
	{
		char *findstr=strstr(file_p->d_name,str);
		if(findstr)//123.mp3  123.mp3.mp4 123.mp3.txt
		{
			//比较后缀
			if(strcmp(findstr,str)==0)
			{
				addr_p=malloc(strlen(DirName)+strlen(file_p->d_name)+1);
				strcpy(addr_p,DirName); //拼接目录
				strcat(addr_p,file_p->d_name);//拼接文件名称
				printf("文件完整路径=%s\n",addr_p);
				free(addr_p); //释放空间
			}
		}
	}
	/*3. 关闭目录*/
	closedir(dirp);
	return 0;
}

int main(int argc,char **argv)
{
	if(argc!=3)
	{
		printf("./app  <.mp3>\n");
		return 0;
	}
	
	PrintDirName(argv[1],argv[2]);
	return 0;
}

任务2: 目录相关操作函数

创建目录、打开目录、读取目录。

​需求: 获取指定目录下指定后缀的所有文件,并且输出每个文件的路径信息。

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

扩展: 递归拷贝,考虑多层目录。

任务3: Makefile文件

poYBAGMlO8uAcYqWAAB494mxKhU924.png

作业:

1.​使用Makefile建立工程,只需要写一个Makefile文件。

2.​使用Makefile建立工程,每个目录下就写一个Makefile文件。

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

    关注

    88

    文章

    11628

    浏览量

    217973
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144611
  • BMP
    BMP
    +关注

    关注

    0

    文章

    48

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux新手通关!5分钟掌握文件/目录管理,告别“找不到北”

    文件夹时明明点了操作,打开却空无一物… 其实 Linux 的文件 / 目录管理有 “固定套路”,学会 8 个核心命令,再记住 3 个避坑技巧
    的头像 发表于 11-17 10:42 165次阅读
    <b class='flag-5'>Linux</b>新手通关!5分钟掌握<b class='flag-5'>文件</b>/<b class='flag-5'>目录</b>管理,告别“找不到北”

    飞凌嵌入式ElfBoard-Linux系统基础入门-文件操作相关shell命令

    2.5 文件操作相关命令2.5.1 touch创建文件命令:touch英文全拼:功能:创建大小为0的一个空
    发表于 09-30 09:46

    Linux系统目录结构全面剖析

    Linux文件系统采用层次化的目录结构,这种设计遵循了Unix哲学中的"一切皆文件"原则。理解Linux
    的头像 发表于 07-21 17:33 586次阅读

    迅为RK3568开发板Dev-Eco studio 的界面布局-导航栏-工程目录

    。 7.1 导航栏 导航栏如下图所示 下面对一些重要的菜单项进行介绍 File 包含了工程的创建,打开和关闭,IDE 整体的配置项设置,签名相关配置 Gradle 的同步操作等。 Build 工程构建
    发表于 06-18 10:30

    鸿蒙开发实现图片上传(上传用户头像)

    应用场景: 选择图片 1.1. 添加图片到相册中 默认的相册中无法添加图片:windows 模拟器可以通过截图来添加图片 1.2. 选择相册图片
    发表于 05-24 23:09

    迅为RK3562开发板旋转Uboot logo和内核logo

    在终端内核目录下输入以下命令,以 root 权限打开文件夹,如图所示: nautilus . 直接旋转 logo 图片即可,进入源码 kernel 目录下,旋转
    发表于 05-20 15:51

    Linux常用命令大全

    Linux常用命令是指在Linux操作系统中广泛使用的命令工具,这些命令工具可以完成各种不同的任务,如管理文件目录
    的头像 发表于 05-03 18:08 1614次阅读

    Linux文件系统打包及镜像制作,触觉智能RK3562开发板演示

    本文介绍Linux开发文件系统打包及镜像制作的方法,演示Linux文件系统打包及镜像制作,适用
    的头像 发表于 04-28 16:45 766次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>文件</b>系统打包及镜像制作,触觉智能RK3562<b class='flag-5'>开发</b>板演示

    迅为RK3588开发板Buildroot系统设置屏幕旋转旋转Uboot logo和内核 logo

    在终端内核目录下输入以下命令,以 root 权限打开文件夹,如图所示: nautilus . 直接旋转 logo 图片即可,进入源码 kernel 目录下,旋转
    发表于 03-27 16:53

    从零开始驯服Linux(一):ZYNQ-Linux启动文件构建全解析

    使用的u-boot源码路径为:开发板资料盘(A 盘)\4_SourceCode\3_Embedded_Linux\资源文件\出厂镜像相关,在该目录下有一个名为
    发表于 03-20 16:48

    在DDC4100根目录的:rollbackBackupDirectoryCWindowsSystem32里找到了.ocx文件,说明书里写的DLL的在哪?

    Guide(DLPU039) 使用DDC4100.exe运行成功,DMD dlp7000 能显示图片。 问题: 1、在DDC4100根目录
    发表于 02-25 07:57

    AI Cube进行yolov8n模型训练,创建项目目标检测时显示数据集目录下存在除标注和图片外的其他目录如何处理?

    AI Cube进行yolov8n模型训练 创建项目目标检测时显示数据集目录下存在除标注和图片外的其他目录怎么解决
    发表于 02-08 06:21

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

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

    Linux中的用户与创建

    Linux中的用户与创建 用户的类型 超级管理用户: 权限最高的用户(uid:0) #uid:是用户的身份证号,Linux系统只认uid 普通用户: 权限受限的用户(uid:1000-60000
    的头像 发表于 12-20 14:24 1200次阅读
    <b class='flag-5'>Linux</b>中的用户与<b class='flag-5'>创建</b>

    SSM开发环境的搭建教程 SSM与Spring Boot的区别

    项目。 配置项目的基本信息,如项目名称、工作空间、分组Id等。 完善项目结构 : 在项目的 src/main/webapp 目录创建 WEB-INF 文件夹,并在其中创建 web.x
    的头像 发表于 12-16 18:13 1816次阅读