在lcd屏幕上的任意位置显示任意大小的图片
/*************************************************
*
* file name:ShowBmp2.c
* author :momolyl@126.com
* date :2024/05/12
* brief :在lcd屏幕上的任意位置显示任意大小的图片
* note :None
*
* CopyRight (c) 2024 momolyl@126.com All Right Reseverd
*
**************************************************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <stdlib.h>
#pragma pack(1)
// 定义BMP文件头部结构
typedef struct
{
unsigned short bfType;
unsigned int bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned int bfOffBits;
} BITMAPFILEHEADER;
typedef struct
{
unsigned int biSize;
int biWidth; // 宽
int biHeight; // 高
unsigned short biPlanes;
unsigned short biBitCount; // 色深
unsigned int biCompression;
unsigned int biSizeImage;
int biXPelsPerMeter;
int biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
} BITMAPINFOHEADER;
#pragma pack()
int main(int argc, char const *argv[])
{
// 1.打开待显示的BMP图像 fopen
FILE *bmp_fp = fopen(argv[1], "rb");
if (NULL == bmp_fp)
{
return -1;
}
// 2.读取BMP文件的图像信息,获取BMP的宽和高
BITMAPINFOHEADER pic;
fseek(bmp_fp, 14, SEEK_SET);
fread(&pic, 1, 40, bmp_fp); // 读取40字节
printf("bmp width = %d,height = %d\n", pic.biWidth, pic.biHeight);
// 3.读取BMP图片的颜色分量 pic.biWidth*pic.biHeight*3
char *bmp_buf = (char *)calloc(pic.biWidth * pic.biHeight * 3, 1);
int offset = (4 - (pic.biWidth * 3) % 4) % 4;
for (int i = 0; i < pic.biHeight; i++)
{
fread(bmp_buf + i * pic.biWidth * 3, 1, pic.biWidth * 3, bmp_fp);
fseek(bmp_fp, offset, SEEK_CUR);
}
// 4.关闭BMP
fclose(bmp_fp);
// 5.打开LCD open
int lcd_fd = open("/dev/fb0", O_RDWR);
// 6.对LCD进行内存映射 mmap
int *lcd_mp = (int *)mmap(NULL, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED, lcd_fd, 0);
// 7.循环的把BMP图像的颜色分量依次写入到LCD的像素点中
int i = 0;
int data = 0;
int X = 0, Y = 0;
printf("please input the picture's site:");
scanf("%d,%d", &X, &Y);
for (int y = Y + pic.biHeight - 1; y >= Y; y--)
{
for (int x = X; x < X + pic.biWidth; ++x)
{
// 把BMP图片的一个像素点的颜色分量转换为LCD屏幕的一个像素点的颜色分量格式 ARGB <--- BGR
data |= bmp_buf[i]; // B
data |= bmp_buf[i + 1] << 8; // G
data |= bmp_buf[i + 2] << 16; // R
lcd_mp[800 * y + x] = data; // BGR BGR BGR ....
i += 3;
data = 0;
}
}
// 8.关闭LCD
close(lcd_fd);
munmap(lcd_mp, 800 * 480 * 4);
return 0;
}
在lcd屏幕上的任意位置显示任意大小的图片的更多相关文章
- JS控制图片显示的大小(图片等比例缩放)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【JS控制图片显示的大小(图片等比例缩放)】
效果: 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...
- React Native 获取组件(Component)在屏幕上的位置
年后主客户端的需求以及老的业务迁移RN,现在疯狂的在学RN.在迁移需求的时候遇到需要获取组件在屏幕上的绝对位置.页面如下: 就需要展开的时候获取sectionHeader(默认排序)在屏幕上的具体位置 ...
- Delphi XE7实现的任意位置弹出菜单
Delphi XE7中目前还没有弹出菜单组件,这个弹出菜单应用很普遍,在JAVA开发的安卓程序中很简单就可以用上了,应该说是一个标准控件.看了一些例子,但是都不能满足我想在任意位置弹出菜单需求,于是自 ...
- iOS开发中获取视图在屏幕上显示的位置
在iOS开发中,我们会经常遇到一个问题,例如,点击一个按钮,弹出一个遮罩层,上面显示一个弹框,弹框显示的位置在按钮附近.如果这个按钮的位置相对于屏幕边缘的距离是固定的,那就容易了,可以直接写死位置.可 ...
- 在屏幕上搜索图片并返回图片所在位置的坐标的AutoHotkey脚本源代码(类似大漠插件)
;~ 在屏幕上搜索图片并返回图片所在位置的坐标的AutoHotkey脚本源代码(类似大漠插件) ; https://www.autohotkey.com/boards/viewtopic.php?t ...
- JAVA基础-输入输出:1.编写TextRw.java的Java应用程序,程序完成的功能是:首先向TextRw.txt中写入自己的学号和姓名,读取TextRw.txt中信息并将其显示在屏幕上。
1.编写TextRw.java的Java应用程序,程序完成的功能是:首先向TextRw.txt中写入自己的学号和姓名,读取TextRw.txt中信息并将其显示在屏幕上. package Test03; ...
- 【opengl】OpenGL中三维物体显示在二维屏幕上显示的变换过程
转自:http://blog.sina.com.cn/s/blog_957b9fdb0100zesv.html 为了说明在三维物体到二维图象之间,需要经过什么样的变换,我们引入了相机(Camera)模 ...
- PPT幻灯片放映不显示备注,只让备注显示在自己屏幕上-投影机 设置
无论是老师或是讲师还是即将要演讲的人,在讲课之前一定会做好课件,到哪一页该讲哪些内容,到哪里该如何去讲等等.那么一般的讲师会将这些课件存放到哪里呢?是用个书本记载下来呢,还是直接存放到电脑上呢?其实本 ...
- [Xcode 实际操作]一、博主领进门-(2)第一个工程项目:将导入的图片显示到屏幕上
目录:[Swift]Xcode实际操作 本文将演示创建第一个工程项目. 在项目导航区,鼠标右键[Assets.xcassets]资源文件夹. 隔壁右侧区域左下角点击[+],打开资源文件管理菜单-> ...
随机推荐
- mybatis查询参数Set遍历查询
#sqlmapper <resultMap id="BaseResultMap" type="com.LogEntity" > <result ...
- Nginx SSL证书更新及密码套件更新
一.域名更换证书 ssl证书一般包括证书文件crt.cer.pem.pfx和私钥文件key. CER.CRT.PEM 和 PFX 是不同的证书文件格式,它们之间存在一些区别: CER (DER 编码) ...
- Kubernetes 审计(Auditing)
目录 一.系统环境 二.前言 三.Kubernetes 审计简介 四.审计策略简介 五.启用审计 5.1 引入审计 5.2 启用审计 六.审计策略 6.1 记录审计阶段为:ResponseStarte ...
- 认识.NET 日志系统
认识.NET 日志系统 基本概念 日志级别:Trace<Debug<Information<Waring<Error<Critical 日志提供者(LoggingProv ...
- Freertos学习:08-信号量
--- title: rtos-freertos-08-ipc-semaphore date: 2020-06-23 11:01:12 categories: tags: - freertos - i ...
- webdav协议及我的笔记方案(私有部署)
背景 用markdown用于文章写作,有几年时间了,不是很喜欢折腾,主要就是在电脑上写,用的笔记软件就是typora.由于里面有很多工作相关的,以及个人资料相关的(包含了各种账号.密码啥的),所以不敢 ...
- Centos 下Rabbit MQ 常用操作指令 汇总
1.rabbitmq 服务的启动停止. service rabbitmq-server start service rabbitmq-server stop 重启命令需要依次执行 stop 再 sta ...
- CF1862C 题解
考虑每个木板在水平放置后对每个位置上产生的贡献. 稍微手玩几组样例: 不难发现一个高度为 \(h\) 的木板在水平放置后会是位置 \([1,h]\) 上高度增加 \(1\). 但是高度最大是 \(10 ...
- AT_abc318_g 题解
因为是图上路径是否经过某个点的问题,所以考虑建出圆方树,然后根据圆方树的性质,\(a\) 到 \(c\) 存在经过 \(b\) 的路径等价于 \(a,c\) 在圆方树上的路径经过 \(b\) 或者 \ ...
- ComfyUI进阶篇:ComfyUI核心节点(三)
ComfyUI核心节点(三) 前言: 学习ComfyUI是一场持久战.当你掌握了ComfyUI的安装和运行之后,会发现大量五花八门的节点.面对各种各样的工作流和复杂的节点种类,可能会让人感到不知所措. ...