Linux高级应用(三)液晶屏显示图片

2023-11-07

一、C语言调用外部函数
1、使用extern关键字来声明

lcd.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int lcd_show_color(int color)
{
//1)打开液晶屏
int fd_lcd;
fd_lcd = open("/dev/fb0", O_RDWR)
if(fd_lcd == -1)
{
perror(“open lcd”);
return -1;
}
//2)向液晶屏写入数据
int lcd_buf[800480];
for(int i=0;i<800
480;i++)
lcd_buf[i]=color;//green
write(fd_lcd,lcd_buf,sizeof(lcd_buf));//8004804

//3)关闭液晶屏
close(fd_lcd)
return 0;

}

main.c
#include <stdio.h>
#include <stdlib.h>

#define RED 0x00FF0000
#define GREEN 0x0000FF00
#define BLUE 0x000000FF

extern int lcd_show_color(int color);
int main(void)
{
while(1)
{
lcd_show_color(RED);
sleep(1);
lcd_show_color(GREEN);
sleep(1);
lcd_show_color(BLUE);
sleep(1);

}
return 0;

}

2.使用头文件

注意两个问题:
1)头文件的包含形式
#include <stdio.h>
#include <stdlib.h>
#include “lcd.h”

< >和" "的区别是什么?
问题:Linux系统默认的头文件的路径在哪里? /usr/include/stdio.h

2)头文件条件编译的作用
#ifndef LCD_H
#define LCD_H 1

#define RED 0x00FF0000
#define GREEN 0x0000FF00
#define BLUE 0x000000FF
int lcd_show_color(int color);

#endif /!LCD_H/

防止头文件重复包含而引起重定义。

二、多个源文件的程序如何编译:
一个源文件的程序:
gcc test.c -o test

多个源文件的编译:
gcc main.c lcd.c -o test

使用Makefile
main:main.o lcd.o
arm-linux-gcc main.o lcd.o -o main
main.o:main.c
arm-linux-gcc main.c -o main.o -c
lcd.o:lcd.c
arm-linux-gcc lcd.c -o lcd.o -c

编译程序:
#make

========================================================================
三、图片的显示
bmp图片
是RGB的位图,是没有经过压缩的,可以直接处理并显示。
jpg图片
是使用jpeg算法进行压缩的图片,需要解压再显示。

bmp图片的显示:
图片的大小:800480像素点,每个像素点是24bits的数据,24bits的数据分别是RGB=8:8:8
bmp图片的大小由两部分组成的:
1)文件的头:54B,是bmp文件的信息:分辨率、色位、创建时间、…
2)颜色数据:800
480*3B=1152000B

BMP图片的显示流程
1、打开bmp文件
例:
int fd_bmp;
fd_bmp = open("./pic/test.bmp", O_RDWR)
if(fd_bmp == -1)
{
perror(“open bmp”);
return -1;
}

2、移动文件指针54B

例:
lseek(fd_bmp,54,SEEK_SET);

3、读取图片的RGB数据
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);

例:
char bmp_buf[8004803];//RGB
read(fd_bmp,bmp_buf,sizeof(bmp_buf));

4、关闭bmp文件
例:
close(fd_bmp);

5、将bmp图片的RGB转换成LCD的ARGB
在bmp图片中,一个像素点是3个字节的数据(RGB);而在显存(LCD)上,一个像素点是4个字节(ARGB)
将char bmp_buf[8004803]的数据转换到int lcd_buf[800*480]中。
第0个像素点:
lcd_buf[0]<----bmp_buf[2](R)、bmp_buf[1](G)、bmp_buf[0](B)
lcd_buf[0] = (0x00<<24)+(bmp_buf[2]<<16) + (bmp_buf[1]<<8) + (bmp+buf[0]<<0)

第1个像素点:
lcd_buf[1] = (0x00<<24)+(bmp_buf[5]<<16) + (bmp_buf[4]<<8) + (bmp+buf[3]<<0)
第2个像素点:
lcd_buf[1] = (0x00<<24)+(bmp_buf[8]<<16) + (bmp_buf[7]<<8) + (bmp+buf[6]<<0)

第n个像素点:
lcd_buf[1] = (0x00<<24)+(bmp_buf[3n+2]<<16) + (bmp_buf[3n+1]<<8) + (bmp+buf[3*n]<<0)
使用for实现。

注意:
显示的图片是上下翻转的,需要正过来。

6、打开液晶屏
例:
int fd_lcd;
fd_lcd = open("/dev/fb0", O_RDWR)
if(fd_lcd == -1)
{
perror(“open lcd”);
return -1;
}

7、将显存数据写入液晶屏
例:
int lcd_buf[800*480];
write(fd_lcd, lcd_buf, sizeof(lcd_buf));

8、关闭液晶屏
例:
close(fd_lcd);

实验1
利用project实现循环显示单色。

实验2
将液晶屏显示图片封装成一个函数lcd_show_bmp(char * bmp_name),加入到lcd.c,在project中编译。
修改main.c实现多张图片循环显示。

提示:
将文件从PC机下载到开发板的方法
1)使用串口线+secureCRT,使用rx命令
比较方便,但是下载速度慢。

2)使用U盘
注意:U盘使用usb2.0,U盘的文件系统格式是fat32格式。

(1)加入图片放入U盘
U盘/pic/test1.bmp
U盘/pic/test2.bmp
U盘/pic/test3.bmp

(2)将U盘插到试验箱的USB口
Linux系统会自动的将U盘挂在到/mnt/udisk/目录下

(3)拷贝U盘中的图片
#cd /mnt/udisk/
#ls
会看到pic文件夹

#cp pic /test
在将应用程序下载到/test目录下。

3)使用网络TFTP协议下载。

============================================================
图片翻转
int lcd_buf[800480];
int lcd_new[800
480];

arm-linux-gcc test.c -o test -std=c99

for(int j=0;i<480;i++)
for(int i=0;i<800;i++)
lcd_new[800*(479-j)+i] = lcd_buf[800*j+i];

#include <stdio.h>
#include <stdlib.h>
#include "lcd.h"

int main(void)
{
	while(1)
	{
		lcd_show_color(RED);
		sleep(1);
		lcd_show_color(GREEN);
		sleep(1);
		lcd_show_color(BLUE);
		sleep(1);		
	}
	return 0;
}
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int lcd_show_color(int color)
{
	//1)打开液晶屏	
	int fd_lcd;
	fd_lcd = open("/dev/fb0", O_RDWR)
	if(fd_lcd == -1)
	{
		perror("open lcd");
		return -1;
	}
	//2)向液晶屏写入数据
	int lcd_buf[800*480];
	for(int i=0;i<800*480;i++)
		lcd_buf[i]=color;//green
	write(fd_lcd,lcd_buf,sizeof(lcd_buf));//800*480*4
	
	//3)关闭液晶屏
	close(fd_lcd);
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux高级应用(三)液晶屏显示图片 的相关文章

  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐