首页 > 其他分享 >开发板随机显示bmp图片

开发板随机显示bmp图片

时间:2024-08-03 20:53:45浏览次数:8  
标签:begin int 开发板 bmp fd 随机 include 图片

开发板随机显示bmp图片


前言

记录一下第一次做了个自己感觉还可以的微小项目,它的效果就是在开发板上可以随机位置显示图片,图片可以是任意大小,但是不要超过开发板大小,那么话不多说,直接开始正餐。


一、开发环境

VScode、wsL(windows下的linux系统)

二、开发工具

GEC6818开发板 800*480
交叉编译工具:arm-linux-gnueabi-5.4.0.tar.xz
串口:secure CRT
传输:tftp技术

三、实现相关

文件IO C语言及其相关函数

四、相关代码

1.显示任意大小图片

代码如下:

//显示任意大小的图片
void show_anybmp(char* bmp_msg, int x_begin, int y_begin, int photo_width, int photo_high)
{  
    //打开图片  
    int bmp_fd = open(bmp_msg, O_RDWR);  
    if(bmp_fd==-1)  
    {  
         printf("图片打开失败!\n");  
         return;  
    }  

    //打开液晶屏  
    int lcd_fd = open("/dev/fb0", O_RDWR);  
    if(lcd_fd==-1)  
    {  
        printf("液晶屏打开失败!\n");  
        return;  

    }  

    //跳过图片头信息的54个字节
	lseek(bmp_fd,54,SEEK_SET);
    
    //定义存储空间存储图片信息
    char bmp_buf[3];
    //定义空间存储由BGR转化为RGB后的图片信息,转化后每一个都表示一个像素
    int  tran_bmp_buf[photo_high*photo_width];

    //读取图片数据  
    int ret;
    int invalid_byte = (4 - (photo_width*3)%4)%4;//保存无效字节,每张图片一行的总字节数都是4的倍数,不够用无效字节补充
    for(int i=0; i<photo_high; i++)  
    {
        for(int k=0; k<photo_width; k++)
        {
            ret = read(bmp_fd, bmp_buf, 3);
            if(ret == -1)
            {
                perror("读取失败!\n");
                return;
            }
            tran_bmp_buf[k+i*photo_width] = 0x00 << 24 | bmp_buf[2] << 16 |
            bmp_buf[1] << 8 | bmp_buf[0];//相当于按行读取图片像素点信息
        }
        lseek(bmp_fd,invalid_byte,SEEK_CUR);
    }  
    
    //获取液晶屏内存映射的首地址
    int* lcd_addr;
    lcd_addr = (int*)mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED, lcd_fd, 0);
    if (lcd_addr == MAP_FAILED) 
    {  
        printf("内存映射失败!\n");  
        close(bmp_fd);  
        close(lcd_fd);  
        return;  
    }  

    //清屏
    for(int i=0; i<SCREEN_HIGH*SCREEN_WIDTH; i++)
    {
        lcd_addr[i] = 0x00000000;
    }

    //往映射的内存填充图片信息
    int count=0;
    for(int i=0; i<PHOTO_HIGH; i++)
    {
        for(int k=0; k<PHOTO_WIDTH; k++)
        {
            lcd_addr[(i+y_begin)*SCREEN_WIDTH + k+x_begin] = tran_bmp_buf[i*PHOTO_WIDTH + k];//寻找开始点
        }
    }

    printf("成功\n");
    //解除内存映射
    munmap(lcd_addr, 800*480*4); 
    //关闭图片 
    close(bmp_fd);
    //关闭液晶屏  
    close(lcd_fd);
}

2.随机显示实现

代码如下:

//运行函数-随机
void operation_rand(char* pathname)
{
    int x_begin,y_begin;
    srand((unsigned int)time(NULL));//根据时间产生随机种子 
    while(1)
    {
         x_begin = rand()%((800 - PHOTO_WIDTH + 1) - 0);//产生0-700随机数,公式:[min,max] rand()%((max-min)+min+1)
         y_begin = rand()%((480 - PHOTO_HIGH + 1) - 0);//产生0-361随机数
         show_anybmp(pathname, x_begin, y_begin, PHOTO_WIDTH, PHOTO_HIGH);
         sleep(1);
    }
}

3.屏保显示

代码如下:

//运行函数-屏保
void operation_screen(char* pathname)
{
    int x_begin,y_begin;
    int array_xy[4][2] = {{363,0}, {700,235}, {383,361},{0,225}};//坐标计算要和图片实际大小来计算 
    while(1)
    {
         for(int i=0; i<4; i++)
         {
           x_begin = array_xy[i][0];
           y_begin = array_xy[i][1];
           show_anybmp(pathname, x_begin, y_begin, PHOTO_WIDTH, PHOTO_HIGH);
           sleep(3);
         }
    }
}

4.主函数

int main(int argc, char** argv)  
{
    if(argc != 2)
    {
        perror("输入一个图片名字!\n");
        return -1;
    }
    operation(argv[1]);
    return 0;  
} 

5.宏定义

// #define  X_BEGIN 700
// #define  Y_BEGIN 361
#define  SCREEN_WIDTH 800
#define  SCREEN_HIGH  480
#define  PHOTO_WIDTH 100
#define  PHOTO_HIGH  119

6.头文件

#ifndef  _MYHEAD_H_
#define  _MYHEAD_H_

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <error.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <math.h>
#include <dirent.h>
#include <stdbool.h>
#include <time.h>
//#include <linux/errno.h>
//#include <linux/input.h>

#endif

五.效果

##1.随机显示图片

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="EmY61ntS-1722676759263" src="https://live.csdn.net/v/embed/414849"></iframe>

随机显示图片

##2.屏保动画

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="8OQuIHOj-1722677700704" src="https://live.csdn.net/v/embed/414854"></iframe>

屏保

六.总结


以上就是今天分享的内容,本文仅仅简单介绍了bmp图片显示,若有错误,欢迎各路大神指正。
备注:虽然不满足彭工(彭龙老师)上课说的小球乱逛,但我照片乱逛应该也算一个想法吧,哈哈哈。

标签:begin,int,开发板,bmp,fd,随机,include,图片
From: https://blog.csdn.net/weixin_65522299/article/details/140892264

相关文章

  • 可验证随机函数 vrf 概述
    一、什么是VRF背景:在传统的区块链中,常用的随机算法是基于伪随机数生成器(PseudorandomNumberGenerator,PRNG)的。PRNG是一种确定性算法,它根据一个初始种子生成一个看似随机的序列。在区块链中,通常使用的是伪随机数序列来选择区块的创建者、确定验证节点的轮换顺序等。然而......
  • 嵌入式实习--MobaXterm连接开发板与SSH远端服务器详细使用教程
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、前期准备二、安装USB串口模块驱动1.1驱动未自动安装二、MobaXterm安装使用2.1MobaXterm软件安装2.2MobaXterm软件使用2.2.1连接开发板2.2.2远程SSH连接服务器前言在嵌入式Li......
  • 【视频讲解】CatBoost、LightGBM和随机森林的海域气田开发特征分类研究
    原文链接:https://tecdat.cn/?p=37208原文出处:拓端数据部落公众号 分析师:ChanglinLi 本文将通过视频讲解,展示如何用CatBoost、LightGBM和随机森林的海域气田开发特征智能分类,并结合一个python分类预测职员离职:逻辑回归、梯度提升、随机森林、XGB、CatBoost、LGBM交叉验证可......
  • 为什么要设置 os.environ[“PYTHONHASHSEED“] = “0“,这样做具体会影响哪些随机值?
    ......
  • 随机森林的可解释性分析(含python代码)
    随机森林的可解释性分析1.引言可解释性的重要性2.随机森林的原理2.1基本原理:2.2随机森林的实现3.随机森林的可解释性分析3.1特征重要性3.2特征重要性3.3SHAP值3.4部分依赖图(PDP)3.5交互特征效应3.6变量依赖图4.结论5.参考文献1.引言在机器学习领域,随机森林......
  • sql更新数据库表的某一字段每条记录的随机数
    sql更更新数据库表的某一字段每条记录的随机数(6位随机数)使用游标实现,以下代码在SQL里执行即可--声明游标DECLARE@user_idvarchar(36)DECLAREuser_extension_cursorCURSORFORSELECTid--表里唯一识别ID(改为自己表里的字段名)FROM[test].[dbo].[my_table]--表名......
  • 随机生成10个整数(1-100的范围)保存到数组,并倒序打印以及求平均值、求最大值和最大值
    1publicclassshuzu19{2//编写一个main方法3publicstaticvoidmain(String[]args){4/*5随机生成10个整数(1-100的范围)保存到数组6并倒序打印以及求平均值、求最大值和最大值的下标、7并查找里面是否有88......
  • 一句JS代码,实现随机颜色的生成
    今天我们只用一句JS代码,实现随机颜色的生成,首先看一下效果:每次刷新浏览器背景颜色都不一样实现此效果的JS函数 :letrandomColor=()=>...:定义一个箭头函数randomColor,用于生成一个随机颜色。Math.random():生成一个0到1之间的随机数。Math.random()*0xffff......
  • 学会如何安装配置开发板Atlas 200I DK A2
    前言学会如何安装配置华为云ModelArts、开发板Atlas200IDKA2。并打通一个Ascend910训练到Ascend310推理的全流程思路。在本篇章,我们首先开始训练阶段!训练阶段A.环境搭建MindSpore华为云模型训练Step1创建OBS并行文件登录华为云->控制台->左侧导航栏选择......
  • 随机森林(Random Forest)预测模型及其特征分析(Python和MATLAB实现)
    ##一、背景在大数据和机器学习的快速发展时代,数据的处理和分析变得尤为重要。随着多个领域积累了海量数据,传统的统计分析方法常常无法满足复杂问题的需求。在这种背景下,机器学习方法开始广泛应用。随机森林(RandomForest)作为一种强大的集成学习方法,因其高效性和较强的泛化能......