【LVGL-文件系统移植】

news2024/11/16 17:52:42

LVGL-文件系统移植

  • ■ LVGL-文件系统移植
    • ■ 示例一:
    • ■ 示例二:视频实例
    • ■ 综合示例:

■ LVGL-文件系统移植

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

■ 示例一:

在这里插入代码片

■ 示例二:视频实例

在这里插入代码片

在这里插入图片描述

■ 综合示例:

/**
 ****************************************************************************************************
 * @file        lv_mainstart.c
 * @author      正点原子团队(ALIENTEK)
 * @version     V1.0
 * @date        2022-03-23
 * @brief       LVGL 文件管理系统 实验
 * @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
 ****************************************************************************************************
 * @attention
 *
 * 实验平台:正点原子 探索者 F407开发板
 * 在线视频:www.yuanzige.com
 * 技术论坛:www.openedv.com
 * 公司网址:www.alientek.com
 * 购买地址:openedv.taobao.com
 *
 ****************************************************************************************************
 */
 
#include "LVGL/GUI_APP/lv_mainstart.h"
#include "./FATFS/exfuns/exfuns.h"
#include "./MALLOC/malloc.h"
#include "./BSP/LCD/lcd.h"
#include "./SYSTEM/usart/usart.h"
#include "lvgl.h"
#include <stdio.h>


LV_FONT_DECLARE(myFont24)
LV_FONT_DECLARE(myFont18)
LV_FONT_DECLARE(myFont14)

lv_file_struct lv_flie;
/* 文件的后缀名,可以在这个数组添加未知的后缀 */
char *lv_suffix [] ={".txt",".avi",".png","jpeg",".jpg",".bin",".gif",".bmp",".FON",".dat",".sif",".BIN",".xbf",".ttf"};
#define LV_SUFFIX(x)    (int)(sizeof(x)/sizeof(x[0])) /* 计算lv_suffix数组的大小 */

uint16_t lv_scan_files (const char* path,lv_obj_t *parent);
void lv_del_list(lv_obj_t *parent);
void lv_create_list(lv_obj_t *parent);
void lv_mainstart(void);
void list_init(lv_obj_t *parent);
lv_obj_t * lv_create_page(lv_obj_t *parent);
char * lv_pash_joint(void);

/**
 * @brief  告诉文件的位置
 * @param  fd:文件指针
 * @return 返回位置
 */
long lv_tell(lv_fs_file_t *fd)
{
    uint32_t pos = 0;
    lv_fs_tell(fd, &pos);
    printf("\nlv_tcur pos is: %d\n", pos);
    return pos;
}

/**
 * @brief  读取文件内容
 * @param  path:文件路径
 * @return LV_FS_RES_OK:读取成功
 */
lv_fs_res_t lv_file_read(const char *path)
{
    uint32_t rsize = 0;
    lv_fs_file_t fd;
    lv_fs_res_t res;

    res = lv_fs_open(&fd, path, LV_FS_MODE_RD);
    
    if (res != LV_FS_RES_OK)
    {
        printf("open %s ERROR\n",path);
        return LV_FS_RES_UNKNOWN;
    }

    lv_tell(&fd);
    lv_fs_seek(&fd,0,LV_FS_SEEK_SET);
    lv_tell(&fd);
    res = lv_fs_read(&fd, lv_flie.rbuf, FILE_SEZE, &rsize);

    if (res != LV_FS_RES_OK)
    {
        printf("read %s ERROR\n",path);
        return LV_FS_RES_UNKNOWN;
    }

    lv_tell(&fd);
    
    lv_fs_close(&fd);
    
    return LV_FS_RES_OK;
}

/**
  * @brief  页面返回按键回调函数
  * @param  obj  : 对象
  * @param  event: 事件
  * @retval 无
  */
void lv_btn_close_event(lv_event_t *event)
{
    lv_event_code_t code = lv_event_get_code(event);
    lv_obj_t * obj = lv_event_get_target(event);

    if (code == LV_EVENT_RELEASED)
    {
        if (lv_flie.lv_image_read != NULL)     /* 判断图片路径释放为空 */
        {
            lv_obj_del(lv_flie.lv_image_read); /* 删除图片对象 */
            lv_flie.lv_image_read = NULL;      /* 设置图片对象为空 */
        }
        
        lv_flie.lv_prev_file_flag -- ;         /* 文件返回标志位减一 */
        
        lv_obj_del(lv_flie.lv_page_cont);      /* 当按下返回时,删除页面 */
    }
}

/**
  * @brief  创建page页面
  * @param  parent:父类
  * @retval 无
  */
lv_obj_t * lv_create_page(lv_obj_t *parent)
{
    lv_flie.lv_page_cont = lv_obj_create(parent);    /* 创建容器 */
    lv_obj_set_size(lv_flie.lv_page_cont, lcddev.width, lcddev.height);
    lv_obj_set_style_radius(lv_flie.lv_page_cont,0,LV_STATE_DEFAULT);/* 设置圆半径为0 */
    lv_obj_clear_flag(lv_flie.lv_page_cont,LV_OBJ_FLAG_SCROLL_CHAIN_HOR);
    lv_obj_clear_flag(lv_flie.lv_page_cont,LV_OBJ_FLAG_SCROLL_CHAIN_VER);
    lv_obj_align_to(lv_flie.lv_page_cont,parent,LV_ALIGN_CENTER,0,0);
  
    lv_obj_t *lv_page_obj = lv_obj_create(lv_flie.lv_page_cont); /* 创建返回按键的区域 */
    lv_obj_set_style_bg_color(lv_page_obj,lv_palette_main(LV_PALETTE_BLUE),LV_STATE_DEFAULT);
    lv_obj_align(lv_page_obj,LV_ALIGN_BOTTOM_MID,0,10);
    lv_obj_set_size(lv_page_obj, lcddev.width, myFont24.line_height);

    lv_obj_t * lv_page_back_btn = lv_label_create(lv_page_obj);  /* 创建lable作为返回的对象 */
    lv_obj_set_style_text_font(lv_page_back_btn,&myFont24,LV_STATE_DEFAULT);
    lv_label_set_text(lv_page_back_btn,"返回");
    lv_obj_align_to(lv_page_back_btn,NULL,LV_ALIGN_CENTER,0,0);
    lv_obj_add_flag(lv_page_back_btn,LV_OBJ_FLAG_CLICKABLE); /* 设置标签可点击 */
    lv_obj_add_event_cb(lv_page_back_btn,lv_btn_close_event,LV_EVENT_ALL,NULL); /* 设置回调函数 */

    return lv_flie.lv_page_cont;
}

/**
  * @brief  显示.txt文件
  * @param  parent:父类
  * @retval 无
  */
void lv_show_filetxt(lv_obj_t *parent)
{
    lv_obj_t * label = lv_label_create(parent);
    lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP);
    lv_obj_set_style_text_font(label,&lv_font_montserrat_18,LV_STATE_DEFAULT);
    lv_obj_set_width(label, lv_obj_get_width(parent));
    lv_label_set_text(label, (char *)lv_flie.rbuf); /* 显示读取的数据 */
    memset(lv_flie.rbuf,0,sizeof(lv_flie.rbuf));
}

/**
  * @brief  显示.bin图片
  * @param  parent:父类
  * @param  path:路径
  * @retval 无
  */
void lv_show_imgbin(lv_obj_t *parent,const char *path)
{
    lv_flie.lv_image_read = lv_img_create(parent);                     /* 创建 image 控件 */   
    lv_img_set_src(lv_flie.lv_image_read,path);                        /* 为控件设置图片 */
//    lv_img_set_auto_size(lv_flie.lv_image_read, true);                 /* 自动设置大小 */
    lv_obj_align_to(lv_flie.lv_image_read,parent,LV_ALIGN_CENTER,0,0); /* 设置控件的对齐方式,相对坐标 */
}

/**
  * @brief  文件路径拼接
  * @param  无
  * @retval 无
  */
char * lv_pash_joint(void)
{
    lv_flie.lv_prev_file[lv_flie.lv_prev_file_flag] = (char *)lv_flie.lv_pash;/* 把上一个路径保存到这个数组里 */
    lv_flie.lv_prev_file_flag ++;                              /* 前一个路径数量标志位加一 */
  
    strcpy((char *)lv_flie.pname, lv_flie.lv_pash);            /* 复制路径(目录) */ 
    strcat((char *)lv_flie.pname, "/");                        /* 复制路径(目录) */ 
    strcat((char *)lv_flie.pname, (char *)lv_flie.lv_pname);   /* 将文件名接在后面 */
    return lv_flie.pname;
}

/**
  * @brief  列表按键回调函数
  * @param  obj  : 对象
  * @param  event: 事件
  * @retval 无
  */
static void lv_list_btn_event(lv_event_t *event)
{
    lv_event_code_t code = lv_event_get_code(event);
    lv_obj_t * obj = lv_event_get_target(event);
  
    if(code == LV_EVENT_CLICKED)
    {
        for (int i = 0; i <= lv_flie.list_flie_nuber ;i++)  /* 轮询列表项 */
        {
            if (obj == lv_flie.list_btn[i]) /* 判断列表项的那个按键按下 */
            {
                lv_flie.lv_pname = mymalloc(SRAMIN, sizeof(lv_flie.lv_pname));         /* 获取文件名分配内存 */
                lv_flie.pname = mymalloc(SRAMIN, sizeof(lv_flie.pname));               /* 为带路径的文件名分配内存 */
                lv_flie.lv_pname = (char *)lv_list_get_btn_text(lv_flie.list,lv_flie.list_btn[i]);  /* 获取列表项的值 */
              
                for (int suffix = 0;suffix < LV_SUFFIX(lv_suffix) ;suffix ++)     /* 轮询文件后缀 */
                {
                    if (strstr(lv_flie.lv_pname,lv_suffix[suffix]) != NULL)       /* 如果不是文件夹 */
                    {
                        lv_flie.lv_suffix_flag = 0;                               /* 设置后缀的标志位为0 */
                        break;
                    }
                }

                if (lv_flie.lv_suffix_flag == 1)                                  /* 该标志位不为0就是文件夹操作 */
                {   
                    lv_flie.lv_pash = lv_pash_joint();                            /* 把文件路径转递给lv_pash参数 */
                    lv_del_list(lv_flie.list);                                    /* 删除列表 */
                    lv_scan_files(lv_flie.pname,lv_scr_act());                    /* 重新创建文件列表 */
                }
                else
                {
                    if (strstr(lv_flie.lv_pname,".txt") != NULL)                  /* 如果不是文件夹且是txt文件 */
                    {
                        if (lv_file_read(lv_pash_joint()) == LV_FS_RES_OK)        /* 判断读取txt文件是否成功 */
                        {
                            lv_flie.lv_return_page = lv_create_page(lv_scr_act());/* 创建页面 */
                            lv_show_filetxt(lv_flie.lv_return_page);              /* 在页面显示txt文件数据 */
                        }
                    }
                    else if (strstr(lv_flie.lv_pname,".bin") != NULL)             /* 如果不是文件夹且是bin文件 */
                    {
                        lv_flie.lv_return_page = lv_create_page(lv_scr_act());    /* 创建页面 */
                        lv_show_imgbin(lv_flie.lv_return_page,lv_pash_joint());   /* 显示bin图片 */
                    }

                    lv_flie.lv_suffix_flag = 1; /* 恢复文件夹点击 */
                }
            }
        }
    }
}

/**
  * @brief  读取文件名
  * @param  char* path: 要扫描的文件路径
  * @retval FR_OK:成功,否则失败
  */
uint16_t lv_scan_files (const char* path,lv_obj_t *parent)
{
    lv_flie.fr = f_opendir(&lv_flie.lv_dir, path);         /* 打开文件目录* */
    memset(lv_flie.list_btn,0,sizeof(lv_flie.list_btn));   /* 清除列表项的数组 */
    lv_flie.list_flie_nuber = 0;                           /* 设置文件索引为0 */
    lv_create_list(parent);                                /* 创建列表 */

    if (lv_flie.pname != NULL||lv_flie.lv_pname != NULL)
    {
        myfree(SRAMIN, lv_flie.pname);                    /* 释放pname内存 */
        myfree(SRAMIN, lv_flie.lv_pname);                 /* 释放lv_pname_shift内存 */
    }

    if (lv_flie.fr == FR_OK)
    {   /* 如果打开成功循环读出文件名字到buff中 */
        while(1)
        {   /* 循环读出文件名字,循环次数等于SD卡根目录下的文件数目 */
            lv_flie.fr = f_readdir(&lv_flie.lv_dir, &lv_flie.SD_fno);        /* 读取文件名* */

            if (lv_flie.fr != LV_FS_RES_OK||lv_flie.SD_fno.fname[0] == 0) break;  /* 读取错误或者读完所有文件结束就跳出循环 */
            lv_flie.list_flie_nuber ++;     /* 文件数量加1 */
           
          if (lv_flie.SD_fno.fattrib& AM_DIR) /* 读取的是文件夹名字 */
            {
               
                /* 复制文件名字到缓存并打印文件名 */
                lv_flie.list_btn[lv_flie.list_flie_nuber] = lv_list_add_btn(lv_flie.list, LV_SYMBOL_DIRECTORY, lv_flie.SD_fno.fname);      /* 添加列表项(文件夹) */
                lv_obj_set_style_img_recolor_filtered(lv_flie.list_btn[lv_flie.list_flie_nuber],lv_color_hex(0xFFD700),LV_STATE_DEFAULT);  /* 设置文件夹重新着色 */
            }
            else /* 读取的是文件名称 */
            {
              
                if (strstr(lv_flie.SD_fno.fname,".png") != NULL    /* 判断文件名称 */
                    ||strstr(lv_flie.SD_fno.fname,".jpeg") != NULL
                    ||strstr(lv_flie.SD_fno.fname,".jpg") != NULL
                    ||strstr(lv_flie.SD_fno.fname,".bmp") != NULL
                    ||strstr(lv_flie.SD_fno.fname,".gif") != NULL
                    ||strstr(lv_flie.SD_fno.fname,".avi") != NULL)
                {
                    lv_flie.image_scr = LV_SYMBOL_IMAGE;
                }
                else
                {
                    lv_flie.image_scr = LV_SYMBOL_FILE;
                }
                
                lv_flie.list_btn[lv_flie.list_flie_nuber] = lv_list_add_btn(lv_flie.list, lv_flie.image_scr, lv_flie.SD_fno.fname);         /* 添加列表项(文件) */ 
                lv_obj_set_style_img_recolor_filtered(lv_flie.list_btn[lv_flie.list_flie_nuber],lv_color_hex(0x87CEFA),LV_STATE_DEFAULT);   /* 设置文件重新着色 */
            }
            
            lv_obj_set_style_pad_left(lv_flie.list_btn[lv_flie.list_flie_nuber],5,LV_STATE_DEFAULT);   /* 设置列表项与列表左边的距离 */
            lv_obj_set_style_pad_right(lv_flie.list_btn[lv_flie.list_flie_nuber],5,LV_STATE_DEFAULT);  /* 设置列表项与列表右边的距离 */
            lv_obj_add_event_cb(lv_flie.list_btn[lv_flie.list_flie_nuber], lv_list_btn_event,LV_EVENT_ALL,NULL); /* 设置列表回调函数 */

        }
        
        f_closedir(&lv_flie.lv_dir); /* 关闭文件目录 */
    }
    
    return lv_flie.fr;                   /* 返回 */
}

/**
  * @brief  删除列表
  * @param  parent: 父类
  * @retval 无
  */
void lv_del_list(lv_obj_t *parent)
{
    lv_obj_del(parent);   /* 删除对象 */
    lv_flie.list = NULL;  /* 设置列表为空 */
}

/**
  * @brief  设置列表动画
  * @param  parent: 父类
  * @retval 无
  */
void lv_animation(lv_obj_t *parent)
{
    lv_anim_t a;                                                /* 第一步:定义一个动画 */
    lv_anim_init(&a);                                           /* 第二步初始化动画 */
    lv_anim_set_var(&a, parent);                                /* 第三步:设置实施动画效果的控件 */
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_x);  /* 设置动画功能 var */
    int32_t start = lv_obj_get_width(lv_scr_act());
    int32_t end = 0;
    lv_anim_set_values(&a, start, end);                         /* 设置开始值和结束值。例如0,150 */
    lv_anim_set_time(&a, 300);                                  /* 动画的长度[ms]设置300mS */
    lv_anim_start(&a);                                          /* 第四步:创建动画 */
}

/**
  * @brief  创建列表
  * @param  parent: 父类
  * @retval 无
  */
void lv_create_list(lv_obj_t *parent)
{
    lv_flie.list = lv_list_create(parent);  /* 创建列表 */
    lv_animation(lv_flie.list);
    lv_obj_set_size(lv_flie.list, lcddev.width, lcddev.height - myFont24.line_height*2 - 10);  /* 设置列表的大小 */
    lv_obj_align_to(lv_flie.list,lv_flie.lv_page_obj,LV_ALIGN_OUT_BOTTOM_LEFT,0,0);            /* 设置列表的对齐模式 */
    lv_obj_set_style_text_font(lv_flie.list,&lv_font_montserrat_24,LV_STATE_DEFAULT);          /* 设置字体 */
    lv_obj_set_style_radius(lv_flie.list,0,LV_STATE_DEFAULT);/* 设置圆半径为0 */
}

/**
  * @brief  创建页面标题
  * @param  parent: 父类
  * @retval 无
  */
void lv_page_tile(lv_obj_t *parent)
{
    lv_flie.lv_page_obj = lv_obj_create(parent);
    lv_obj_set_size(lv_flie.lv_page_obj,lcddev.width,myFont24.line_height);
    lv_obj_set_style_bg_color(lv_flie.lv_page_obj,lv_palette_main(LV_PALETTE_GREY),LV_STATE_DEFAULT);
    lv_obj_set_style_radius(lv_flie.lv_page_obj,0,LV_STATE_DEFAULT);/* 设置圆半径为0 */
    lv_obj_align_to(lv_flie.lv_page_obj,parent,LV_ALIGN_TOP_LEFT,0,0);
    
    lv_obj_t *lv_page_label = lv_label_create(lv_flie.lv_page_obj);
    lv_label_set_text(lv_page_label,"文件管理系统");
    lv_obj_set_style_text_color(lv_page_label,lv_palette_main(LV_PALETTE_RED),LV_STATE_DEFAULT);
    lv_obj_set_style_text_font(lv_page_label,&myFont24,LV_STATE_DEFAULT);
    lv_obj_align_to(lv_page_label,lv_flie.lv_page_obj,LV_ALIGN_CENTER,0,0);
}

/**
  * @brief  返回按键回调函数
  * @param  obj:对象
  * @param  event:事件
  * @retval 无
  */
void lv_back_btn_event_handler(lv_event_t *event)
{
    lv_event_code_t code = lv_event_get_code(event);
    lv_obj_t * obj = lv_event_get_target(event);
  
    if(code == LV_EVENT_SHORT_CLICKED)
    {
        if (obj == lv_flie.lv_back_btn)
        {
            lv_del_list(lv_flie.list);         /* 删除列表 */
            list_init(lv_scr_act());           /* 返回菜单 */
        }
        if (obj == lv_flie.lv_prev_btn)
        { 
            lv_flie.lv_prev_file_flag -- ;     /* 文件返回标志位减一 */

            if (lv_flie.lv_prev_file_flag <= 0)
            {
                lv_flie.lv_prev_file_flag = 0; /* 如果小于等于0,就强制设置为0 */
            }
          
            lv_del_list(lv_flie.list);         /* 立刻删除列表控件 */
            lv_flie.lv_pash = lv_flie.lv_prev_file[lv_flie.lv_prev_file_flag]; /* 上级路径复制到lv_pash参数 */
            lv_scan_files(lv_flie.lv_prev_file[lv_flie.lv_prev_file_flag],lv_scr_act());/* 读取文件路径 */
           
        }
    }
}

/**
  * @brief  返回按键
  * @param  parent:父类
  * @retval 无
  */
void lv_general_win_create(lv_obj_t *parent)
{
    lv_flie.lv_back_btn = lv_label_create(parent);
    lv_obj_set_style_text_font(lv_flie.lv_back_btn,&myFont24,LV_STATE_DEFAULT); /* 设置字体 */
    
    lv_label_set_text(lv_flie.lv_back_btn,"菜单");
    lv_obj_align_to(lv_flie.lv_back_btn,parent,LV_ALIGN_RIGHT_MID,-10,0);
    lv_obj_add_flag(lv_flie.lv_back_btn,LV_OBJ_FLAG_CLICKABLE); /* 设置标签可点击 */
    lv_obj_add_event_cb(lv_flie.lv_back_btn,lv_back_btn_event_handler,LV_EVENT_ALL,NULL); /* 设置回调函数 */
    lv_flie.lv_prev_btn = lv_label_create(parent);
    lv_obj_set_style_text_font(lv_flie.lv_prev_btn,&myFont24,LV_STATE_DEFAULT);
    lv_label_set_text(lv_flie.lv_prev_btn,"返回");
    lv_obj_align_to(lv_flie.lv_prev_btn,parent,LV_ALIGN_LEFT_MID,10,0);
    lv_obj_add_flag(lv_flie.lv_prev_btn,LV_OBJ_FLAG_CLICKABLE); /* 设置标签可点击 */
    lv_obj_add_event_cb(lv_flie.lv_prev_btn,lv_back_btn_event_handler,LV_EVENT_ALL,NULL);
}

/**
  * @brief  文件系统返回/菜单按键的区域
  * @param  parent: 父类
  * @retval 无
  */
void lv_page_back(lv_obj_t *parent)
{
    lv_flie.lv_back_obj = lv_obj_create(parent);                                                            /* 创建文件返回对象区域 */
    lv_obj_set_size(lv_flie.lv_back_obj,lcddev.width,myFont24.line_height+10);                              /* 设置改区域的大小 */
    lv_obj_set_style_bg_color(lv_flie.lv_back_obj,lv_palette_main(LV_PALETTE_GREY),LV_STATE_DEFAULT);       /* 设置该区域的颜色为灰色 */
    lv_obj_set_style_radius(lv_flie.lv_back_obj,0,LV_STATE_DEFAULT);                                        /* 设置圆半径为0 */
    lv_obj_align_to(lv_flie.lv_back_obj,parent,LV_ALIGN_BOTTOM_MID,0,0);                                    /* 设置对齐模式 */
    lv_general_win_create(lv_flie.lv_back_obj);                                                             /* 创建返回和菜单按键 */
}

/**
  * @brief  列表初始化
  * @param  parent: 父类
  * @retval 无
  */
void list_init(lv_obj_t *parent)
{
    lv_flie.lv_pash = "0:";                                 /* 初始路径 */
    lv_flie.lv_prev_file_flag = 0;                          /* 上一个文件路径标志位清0 */
    lv_flie.lv_prev_file[lv_flie.lv_prev_file_flag] = "0:"; /* 初始上个文件夹路径 */
    lv_flie.list_flie_nuber = 0;                            /* 初始文件数量 */
    lv_flie.lv_suffix_flag = 1;                             /* 文件后缀标志位 */
    lv_scan_files(lv_flie.lv_pash,parent);                  /* 读取文件路径 */
}

/**
  * @brief  控件测试函数
  * @param  无
  * @retval 无
  */
void lv_mainstart(void)
{
    lv_page_tile(lv_scr_act());         /* 设置页面标题 */
    lv_page_back(lv_scr_act());         /* 设置页面返回 */
    list_init(lv_scr_act());            /* 列表初始化 */
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1548748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年第16届大广赛新命题发布-爱华仕箱包

2024年3月27日&#xff0c;2024年第16届大广赛发布了新的命题&#xff0c;爱华仕箱包命题&#xff0c;自2017年起&#xff0c;爱华仕箱包已连续8年担任全国大学生广告艺术大赛命题单位。 爱华仕现已实现百货、超市、电商、礼品、投标、海外市场6大零售网络的全覆盖&#xff0c…

一口气搞懂分库分表 12 种分片算法,大厂都在用

前言 本文是《ShardingSphere5.x分库分表原理与实战》系列的第五篇文章&#xff0c;我们一起梳理下ShardingSphere框架中的核心部分分片策略和分片算法&#xff0c;其内部针为我们提供了多种分片策略和分片算法&#xff0c;来应对不同的业务场景&#xff0c;本着拿来即用的原则…

CD盘里的cda文件如何拷取成mp3?

CDA并非一种独立的音频文件格式&#xff0c;而是指存储在音乐CD上的音轨文件。这种格式的起源可以追溯到CD制造商对一种在CD播放器上直接播放音轨的需求&#xff0c;而不是在计算机上存储音频文件。因此&#xff0c;CDA通常存在于音乐CD中&#xff0c;为提供一种便捷的音频存储…

python--切片

1.切片&#xff1a; 切片是编程语言为有序序列&#xff08;sequence&#xff09;准备的&#xff0c;用来切割或者截取某个片段 一个完整的切片是包含三个参数和两个冒号" : " ,用于分隔三个参数(start_index、end_index、step)。当只有一个“:”时&#xff0c;默认第…

JavaScript混淆工具选择与使用指南

摘要 本文介绍了什么是js混淆工具&#xff0c;以及为什么需要使用js混淆工具。详细解释了js混淆工具的实现原理和作用&#xff0c;探讨了如何选择合适的js混淆工具&#xff0c;列举了几款常用的js混淆工具&#xff0c;并对它们的特点和适用场景进行了分析。最后总结了js混淆工…

手把手教你绘画原型图:Axure的安装使用

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师&#xff0c;大模型&#xff0c;爬虫、ACM算法 &#x1f492; 公众号&#xff…

【C++】类和对象入门(从struct到class带你了解类和对象!)

&#x1f338;博主主页&#xff1a;釉色清风&#x1f338;文章专栏&#xff1a;C&#x1f338;今日语录&#xff1a;人生本就是一首代写的诗歌&#xff0c;而他们的文字浅薄&#xff0c;不该被潦草地印刷着。所以在我笔下&#xff0c;“一重山有一重山地错落&#xff0c;我有我…

28位驻华大使、公使参访苏州金龙 点赞刚刚全球发布的新V系大巴

3月26日下午&#xff0c;由外交部组织的“驻华使节团参访江苏”活动走进苏州金龙。来自28个国家和国际组织的驻华大使、公使参观了苏州金龙展厅&#xff0c;并试乘体验了苏州金龙全新V系大巴。外交部中国政府欧洲事务特别代表吴红波&#xff0c;外交部礼宾司、翻译司、非洲司、…

javascript基础代码练习

一、输入新增病例数&#xff0c;累计确诊病例数&#xff0c;14天内聚集性疫情发生天数。新增或者累计确诊病例为0则该地区为低风险地区。新增大于0且累计确诊&#xff1c;50或者累计大于50且14天内聚集性疫情发生天数为0的地区为中风险地区。其他情况为高风险地区。 <!DOCT…

大数据Hadoop入门04 ——【HDFS shell操作】

一、HDSF shell命令行解释说明 1、介绍 命令行界面&#xff08;英语: command-line interface&#xff0c;缩写: CLl)&#xff0c;是指用户通过键盘输入指令&#xff0c;计算机接收到指令后&#xff0c;予以执行一种人际交互方式。Hadoop提供了文件系统的shell命令行客户端:…

labelme自动标注工具的安装和python代码修改

labelme嵌入SAM和EfficientSAM自动标注模型 目录: 1.labelme windows环境下安装python版本labelme 2.labelme.exe直接安装 3.labelme生成exe 4.labelme python代码修改 labelme自动标注使用方法 编辑/Create AI-Polygon 自动分割,直接生成分割图,标注为point,完成标注后…

Typora 主题配置

title: Typora主题配置 search: 2024-03-19 tags: “#Typora主题” Typora 主题配置 文章目录 Typora 主题配置Step-1 进入官方主题网站Step-2 选中主题&#xff0c;并点击DownloadStep-3 跳转到 github 网站Step-4 直接下载源码Step-5 解压下载的源码Step-6 找到下载源码中的…

01背包-动态规划

01背包 易知状态转移方程为&#xff1a; dp[i][j] max(dp[i-1][j],dp[i-1][j-v[i]]w[i]) 代码 N,V map(int,input().split()) v, w [0],[0] # 体积v&#xff0c;价值w for i in range(N):a list(map(int,input().split()))v.append(a[0]) # 体积viw.append(a[1]) # 价值w…

NO11 蓝桥杯单片机之DS18B20数字温度计

DS18B20数字温度计这个模块和以往单片机学习的模块可能不同&#xff0c;这里还要知道其头文件&#xff08;.h&#xff09;和.c文件代码的理解。 具体这个温度计是怎么实现检测温度的&#xff0c;呃呃呃呃呃这可能就要去查阅专业资料&#xff0c;涉及的知识体系应该很庞大&…

公众号软文怎么写?媒介盒子告诉你

公众号软文是指在微信公众号平台上发布的一种营销文章&#xff0c;旨在通过有针对性的内容和亲民易懂的语言吸引读者&#xff0c;提高品牌知名度和销售额。然而公众号软文想要写好需要一定的技巧&#xff0c;今天媒介盒子就来和大家聊聊。 一、 分析用户需求 文案是写给用户看…

【深度学习】图片预处理,分辨出模糊图片

ref:https://pyimagesearch.com/2015/09/07/blur-detection-with-opencv/ 论文 ref:https://www.cse.cuhk.edu.hk/leojia/all_final_papers/blur_detect_cvpr08.pdf 遇到模糊的图片&#xff0c;还要处理一下&#xff0c;把它挑出来&#xff0c;要么修复&#xff0c;要么弃用。否…

【数学】第十三届蓝桥杯省赛C++ A组/研究生组 Python A组/研究生组《数的拆分》(C++)

【题目描述】 给定 T 个正整数 &#xff0c;分别问每个 能否表示为 的形式&#xff0c;其中 , 为正整数&#xff0c;, 为大于等于 2 的正整数。 【输入格式】 输入第一行包含一个整数 T 表示询问次数。 接下来 T 行&#xff0c;每行包含一个正整数 。 【输出格式】 对于…

CentOS 7 下安装RabbitMQ教程

CentOS 7 下安装RabbitMQ教程 一、做准备&#xff08;VMWare 虚拟机上的 CentOS 7 镜像 上安装的&#xff09; &#xff08;1&#xff09;准备RabbitMQ的安装包&#xff08;rabbitmq-server-3.8.5-1.el7.noarch&#xff09;下载地址mq &#xff08;2&#xff09;还得准备erl…

你的 Python 代码需要解释一下了!

Python 是一种相对简单的编程语言。它主要以解释型语言著称&#xff0c;这意味着每行代码都要通过解释器逐行执行。不过在某些时候&#xff0c;将 Python 代码翻译成计算机可以理解的内容&#xff0c;然后再逐行执行&#xff0c;可以减少繁琐。 在这种情况下&#xff0c;编译器…

日本EPSON 爱普生HUD汽车抬头显示系统芯片

目前HUD产品在新车上的配装率逐年上升&#xff0c;预计在2025年将达到30%。那么在介绍爱普生HUD整合方案之前&#xff0c;让我们先了解一下什么叫HUD。 HUD&#xff08;Head Up Display&#xff09;中文叫抬头显示系统&#xff0c;又被叫做平行显示系统。早被应用在飞机辅助…