活动介绍

import sys import cv2 from showPic import Ui_MainWindow from PyQt5 import QtGui from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * class videoShow(QMainWindow,Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) @pyqtSlot() def on_pushButton_record_clicked(self): camera_path = 0 # 0:自带摄像头 1:外接摄像头 "xxx.mp4" "rtsp://admin:[email protected]/cam/..." capture = cv2.VideoCapture(camera_path) # 初始化播放器 流媒体 fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V') # XVID/DIVX MPEG MJPG X264 video_writer = cv2.VideoWriter("image/myself.mp4", fourcc, 25, (960, 540)) # 存放路径、、帧率fps、尺寸(且保证下面的frame也是这个尺寸) while True: flag, frame = capture.read() if flag is False: continue frame = cv2.resize(frame, (960, 540)) video_writer.write(frame) cv2.imshow("video", frame) key = cv2.waitKey(25) if key == 27: video_writer.release() break if __name__ == '__main__': app = QApplication(sys.argv) ui = videoShow() ui.show() sys.exit(app.exec_())在这样代码的基础上添加点击按钮播放已经录制好的视频

时间: 2024-02-14 14:30:09 浏览: 155
您可以在`videoShow`类中添加一个点击按钮播放已经录制好的视频的槽函数,然后在UI文件中添加一个按钮,并将其与该槽函数关联。以下是修改后的代码示例: ```python import sys import cv2 from showPic import Ui_MainWindow from PyQt5 import QtGui from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * class videoShow(QMainWindow,Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) @pyqtSlot() def on_pushButton_record_clicked(self): camera_path = 0 # 0:自带摄像头 1:外接摄像头 "xxx.mp4" "rtsp://admin:[email protected]/cam/..." capture = cv2.VideoCapture(camera_path) # 初始化播放器 流媒体 fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V') # XVID/DIVX MPEG MJPG X264 video_writer = cv2.VideoWriter("image/myself.mp4", fourcc, 25, (960, 540)) # 存放路径、、帧率fps、尺寸(且保证下面的frame也是这个尺寸) while True: flag, frame = capture.read() if flag is False: continue frame = cv2.resize(frame, (960, 540)) video_writer.write(frame) cv2.imshow("video", frame) key = cv2.waitKey(25) if key == 27: video_writer.release() break @pyqtSlot() def on_pushButton_play_clicked(self): video_path = "image/myself.mp4" # 已经录制好的视频路径 capture = cv2.VideoCapture(video_path) # 初始化播放器 while True: flag, frame = capture.read() if flag is False: break cv2.imshow("video", frame) key = cv2.waitKey(25) if key == 27: break capture.release() if __name__ == '__main__': app = QApplication(sys.argv) ui = videoShow() ui.show() sys.exit(app.exec_()) ``` 在修改后的代码中,我们添加了一个名为`on_pushButton_play_clicked`的槽函数,并在该函数中使用`cv2.VideoCapture`打开已经录制好的视频,并通过`cv2.imshow`显示每一帧。您需要在UI文件中添加一个名为`pushButton_play`的按钮,并将其与该槽函数关联。当您点击该按钮时,录制好的视频将会开始播放。
阅读全文

相关推荐

import sys import os import time from PyQt5 import QtGui #重新导入 from PyQt5 import QtCore #重新导入 from showPic import Ui_MainWindow from PyQt5.QtCore import * from PyQt5.QtGui import * #导入的外面 from PyQt5.QtWidgets import * import cv2 # 方法二 class picShow(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) # 方法一 # self.picMap = QtGui.QPixmap("img0.jpg") # self.label.setGeometry(QtCore.QRect(40, 40, 960, 560)) # 修改大小 # self.label.setPixmap(self.picMap) # 方法二(常用) self.n = 0 self.timer = QTimer(self) # 创建QT计时器 self.timer.timeout.connect(self.timer_pic) # 链接计时器触发函数 self.timer.start(1000) # 设置轮播间隔,里面单位是毫秒 self.dir_path = r"E:\pycharm\new_subject\image/" # r用来确保斜杠转义问题,最后的/一定要带上 self.file_list = os.listdir(self.dir_path) # print(file_list) def timer_pic(self): self.n += 1 # 调用函数实现自增 if self.n >= len(self.file_list): # 回退索引,轮播效果 self.n = 0 image_name = self.dir_path + self.file_list[self.n] url = image_name pic_image = cv2.imread(url) pic_image = cv2.cvtColor(pic_image, cv2.COLOR_BGR2RGB) # 将BGR格式图像转换成RGB height, width = pic_image.shape[:2] pixMap = QImage(pic_image.data, width, height, width*3, QImage.Format_RGB888) # 将RGB格式图像转换为八位图 pixMap = QPixmap.fromImage(pixMap) ratio = max(width/self.label.width(), height/self.label.height()) pixMap.setDevicePixelRatio(ratio) # 根据图片比例显示 self.label.setAlignment(Qt.AlignCenter) # 设置居中 self.label.setPixmap(pixMap) if __name__ == '__main__': app = QApplication(sys.argv) ui = picShow() ui.show() sys.exit(app.exec_())每一行是什么意思?

#include "lvgl/lvgl.h" #include "lvgl/demos/lv_demos.h" #include <unistd.h> #include #include <time.h> #include <stdio.h> #include <stdlib.h> struct node { char path[1024]; struct node *next; struct node *prev; }; static const char * getenv_default(const char * name, const char * dflt) { return getenv(name) ?: dflt; } #if LV_USE_LINUX_FBDEV static void lv_linux_disp_init(void) { const char * device = getenv_default("LV_LINUX_FBDEV_DEVICE", "/dev/fb0"); lv_display_t * disp = lv_linux_fbdev_create(); lv_linux_fbdev_set_file(disp, device); } #elif LV_USE_LINUX_DRM static void lv_linux_disp_init(void) { const char * device = getenv_default("LV_LINUX_DRM_CARD", "/dev/dri/card0"); lv_display_t * disp = lv_linux_drm_create(); lv_linux_drm_set_file(disp, device, -1); } #elif LV_USE_SDL static void lv_linux_disp_init(void) { const int width = atoi(getenv("LV_SDL_VIDEO_WIDTH") ?: "800"); const int height = atoi(getenv("LV_SDL_VIDEO_HEIGHT") ?: "480"); lv_sdl_window_create(width, height); } #else #error Unsupported configuration #endif lv_obj_t *btn; lv_obj_t *btn1; lv_obj_t *btn2; lv_obj_t *btn3; static lv_obj_t *current_img = NULL; struct node *pos = NULL; struct node * up_showpic(){ lv_obj_t *img1 = lv_image_create(lv_screen_active()); pos = pos -> prev; char path[1024]; char ch = 'A'; sprintf(path,"%c:%s",ch,pos->path); lv_image_set_src(img1,path); return pos; } struct node * down_showpic(){ lv_obj_t *img1 = lv_image_create(lv_screen_active()); pos = pos -> next; char path[1024]; char ch = 'A'; sprintf(path,"%c:%s",ch,pos->path); lv_image_set_src(img1,path); return pos; } static void button_cb(lv_event_t *e){ void *obj = lv_event_get_target(e); printf("按钮被点击%p\n",obj); if(btn == obj){ printf("往上切换图片\n"); pos = up_showpic(); } else if(btn1 == obj){ printf("往下切换图片\n"); pos = down_showpic(); } else if(btn2 == obj){ lv_obj_t *img1 = lv_image_create(lv_screen_active()); char path[4096]; char ch = 'A'; sprintf(path,"%c:%s",ch,pos->path); printf("放大图片\n"); lv_image_set_scale(img1,512); } else if(btn3 == obj){ printf("缩小图片\n"); } }改成这样,放大图片不会段错误了。但是没有反应

#include "lvgl/lvgl.h" #include "lvgl/demos/lv_demos.h" #include <unistd.h> #include #include <time.h> #include <stdio.h> #include <stdlib.h> struct node { char path[1024]; struct node *next; struct node *prev; }; static const char * getenv_default(const char * name, const char * dflt) { return getenv(name) ?: dflt; } #if LV_USE_LINUX_FBDEV static void lv_linux_disp_init(void) { const char * device = getenv_default("LV_LINUX_FBDEV_DEVICE", "/dev/fb0"); lv_display_t * disp = lv_linux_fbdev_create(); lv_linux_fbdev_set_file(disp, device); } #elif LV_USE_LINUX_DRM static void lv_linux_disp_init(void) { const char * device = getenv_default("LV_LINUX_DRM_CARD", "/dev/dri/card0"); lv_display_t * disp = lv_linux_drm_create(); lv_linux_drm_set_file(disp, device, -1); } #elif LV_USE_SDL static void lv_linux_disp_init(void) { const int width = atoi(getenv("LV_SDL_VIDEO_WIDTH") ?: "800"); const int height = atoi(getenv("LV_SDL_VIDEO_HEIGHT") ?: "480"); lv_sdl_window_create(width, height); } #else #error Unsupported configuration #endif lv_obj_t *btn; lv_obj_t *btn1; lv_obj_t *btn2; lv_obj_t *btn3; lv_obj_t *imgup = NULL; lv_obj_t *imgdown = NULL; lv_obj_t *imgbig = NULL; lv_obj_t *imgnow = NULL; struct node *pos = NULL; lv_obj_t * up_showpic(){ imgup = lv_image_create(lv_screen_active()); pos = pos -> prev; char path[1024]; char ch = 'A'; sprintf(path,"%c:%s",ch,pos->path); lv_image_set_src(imgup,path); return imgup; } lv_obj_t * down_showpic(){ imgdown = lv_image_create(lv_screen_active()); pos = pos -> next; char path[1024]; char ch = 'A'; sprintf(path,"%c:%s",ch,pos->path); lv_image_set_src(imgdown,path); return imgdown; } static void button_cb(lv_event_t *e){ void *obj = lv_event_get_target(e); printf("按钮被点击%p\n",obj); if(btn == obj){ printf("往上切换图片\n"); imgnow = up_showpic(); } else if(btn1 == obj){ printf("往下切换图片\n"); imgnow = down_showpic(); } } static void button_cb1(lv_event_t *e){ void *obj = lv_event_get_target(e); printf("按钮被点击%p\n",obj); if(btn2 == obj){ printf("放大图片\n"); lv_image_set_scale(imgnow, 512); } else if(btn3 == obj){ printf("缩小图片\n"); lv_image_set_scale_y(imgnow, 128); } }实现放大一次了,但是为什么一按缩小,整张图片都不见了

/********************************************************************************************** Copyright 2008 - 2019 深圳市信盈达电子有限公司. All rights reserved. 描述 : 作者 : 何文宾 版本 : V1.0 修改 : 完成日期: 2019年2月17日 信盈达官网:http://www.edu118.com/ 信盈达网校:http://www.edu118.cn/ 信盈达技术论坛:http://bbs.edu118.com/ Notice :本程序只供学习使用,未经作者许可,不得用于其它任何用途。版权所有,盗版必究 ***********************************************************************************************/ /********************************************************************************************** * INCLUDES */ #include "oled.h" #include "systick.h" #include "font.h" #include "rtc.h" /********************************************************************************************** * CONSTANTS */ /********************************************************************************************** * TYPEDEFS */ /********************************************************************************************** * LOCAL VARIABLES */ /********************************************************************************************** * LOCAL FUNCTIONS DECLARE */ /********************************************************************************************** * LOCAL FUNCTIONS */ /********************************************************************************************** * PUBLIC FUNCTIONS */ /******************************************************************* * 函数名: OLED_Init() * 功能描述 : 初始化oled * 作者: 何文宾 * 参数说明: 无 * 返回值说明: 无 * 修改记录: * 其他: *******************************************************************/ /** SCK----PB13 MOSI---PB15 CS-----PA15 DC-----PA11 RES----PA12 */ void OLED_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; SPI_InitTypeDef SPI_InitStruct; /***********************管脚定义********************************************/ if(SPI_MODE) { /*************************硬件SPI*********************************************/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);//使能A&&B时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO时钟 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);//SPI2时钟使能 /*CS-----PA15*/ //推挽输出 50MHZ GPIO_InitStruct.GPIO_Pin = OLED_CS_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(OLED_GPIO,&GPIO_InitStruct); /*DC-----PA11*/ //推挽输出 50MHZ GPIO_InitStruct.GPIO_Pin = OLED_DC_PIN; GPIO_Init(OLED_GPIO,&GPIO_InitStruct); /*RES-----PA12*/ //推挽输出 50MHZ GPIO_InitStruct.GPIO_Pin = OLED_RES_PIN; GPIO_Init(OLED_GPIO,&GPIO_InitStruct); OLED_RES_H; /*SCK----PB13*/ //复用推挽输出 50MHZ GPIO_InitStruct.GPIO_Pin = OLED_SCK_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(OLED_SPI_GPIO,&GPIO_InitStruct); /*MOSI---PB15*/ //复用推挽输出 50MHZ GPIO_InitStruct.GPIO_Pin = OLED_MOSI_PIN; GPIO_Init(OLED_SPI_GPIO,&GPIO_InitStruct); /*MISO---PB14*/ //浮空输入 GPIO_InitStruct.GPIO_Pin = OLED_MISO_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(OLED_SPI_GPIO,&GPIO_InitStruct); SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//波特率 SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;//在时钟第二个电平发送数据 SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;//时钟空闲状态为高电平 SPI_InitStruct.SPI_CRCPolynomial = DISABLE; SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;//8位数据帧 SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//双线双向模式 SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;//先发高位 SPI_InitStruct.SPI_Mode = SPI_Mode_Master;//主机模式 SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;//软件从设备管理 SPI_Init(SPI2,&SPI_InitStruct); SPI_Cmd(SPI2,ENABLE); spi_read_write(0xff); } else { /*软件模拟SPI*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);//使能A&&B时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO时钟 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); /*SCK----PB13*/ //推挽输出 50MHZ GPIO_InitStruct.GPIO_Pin = OLED_SCK_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(OLED_SPI_GPIO,&GPIO_InitStruct); /*MOSI---PB15*/ //推挽输出 50MHZ GPIO_InitStruct.GPIO_Pin = OLED_MOSI_PIN; GPIO_Init(OLED_SPI_GPIO,&GPIO_InitStruct); /*CS-----PA15*/ //推挽输出 50MHZ GPIO_InitStruct.GPIO_Pin = OLED_CS_PIN; GPIO_Init(OLED_GPIO,&GPIO_InitStruct); /*DC-----PA11*/ //推挽输出 50MHZ GPIO_InitStruct.GPIO_Pin = OLED_DC_PIN; GPIO_Init(OLED_GPIO,&GPIO_InitStruct); /*RES-----PA12*/ //推挽输出 50MHZ GPIO_InitStruct.GPIO_Pin = OLED_RES_PIN; GPIO_Init(OLED_GPIO,&GPIO_InitStruct); OLED_RES_H; } /***********************初始化时序********************************************/ delay_ms(200); Oled_Write_Cmd(0xAE); //关闭显示 Oled_Write_Cmd(0xD5); //设置时钟分频因子,震荡频率 Oled_Write_Cmd(80); //[3:0],分频因子;[7:4],震荡频率 Oled_Write_Cmd(0xA8); //设置驱动路数 Oled_Write_Cmd(0X3F); //默认0X3F(1/64) Oled_Write_Cmd(0xD3); //设置显示偏移 Oled_Write_Cmd(0X00); //默认为0 Oled_Write_Cmd(0x40); //设置显示开始行 [5:0],行数. Oled_Write_Cmd(0x8D); //电荷泵设置 Oled_Write_Cmd(0x14); //bit2,开启/关闭 Oled_Write_Cmd(0x20); //设置内存地址模式 Oled_Write_Cmd(0x02); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10; Oled_Write_Cmd(0xA1); //段重定义设置,bit0:0,0->0;1,0->127; Oled_Write_Cmd(0xC8); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数 Oled_Write_Cmd(0xDA); //设置COM硬件引脚配置 Oled_Write_Cmd(0x12); //[5:4]配置 Oled_Write_Cmd(0x81); //对比度设置 Oled_Write_Cmd(0xEF); //1~255;默认0X7F (亮度设置,越大越亮) Oled_Write_Cmd(0xD9); //设置预充电周期 Oled_Write_Cmd(0xf1); //[3:0],PHASE 1;[7:4],PHASE 2; Oled_Write_Cmd(0xDB); //设置VCOMH 电压倍率 Oled_Write_Cmd(0x30); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc; Oled_Write_Cmd(0xA4); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏) Oled_Write_Cmd(0xA6); //设置显示方式;bit0:1,反相显示;0,正常显示 Oled_Write_Cmd(0xAF); //开启显示 OLED_Clear(0,128,0,8,0x00); } /******************************************************************* * 函数名: spi_read_write() * 功能描述 : SPI读写数据 * 作者: 何文宾 * 参数说明: 待发送的数据 * 返回值说明: 读取的值 * 修改记录: * 其他: *******************************************************************/ //SPI读写数据 u8 spi_read_write(u8 dat) { if (SPI_MODE) { while(!SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)); //等待发送缓冲为空 SPI_I2S_SendData(SPI2,dat); while(!SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)); //等待接收缓冲不为空 return SPI_I2S_ReceiveData(SPI2); //返回收到的数据 } else { u8 i; OLED_CS_L; for(i=0;i<8;i++) { OLED_SCK_L; if((dat&0x80)) { OLED_MOSI_H; } else OLED_MOSI_L; OLED_SCK_H; dat<<=1; } OLED_CS_H; return dat; } } /******************************************************************* * 函数名: Oled_Write_Data() * 功能描述 : OLED写数据 * 作者: 何文宾 * 参数说明: 待发送的指令 * 返回值说明: * 修改记录: * 其他: *******************************************************************/ void Oled_Write_Data(u8 dat) { OLED_DC_H; OLED_CS_L; spi_read_write(dat); OLED_CS_H; } /******************************************************************* * 函数名: Oled_Write_Cmd() * 功能描述 : OLED写指令 * 作者: 何文宾 * 参数说明: 待发送的指令 * 返回值说明: * 修改记录: * 其他: *******************************************************************/ void Oled_Write_Cmd(u8 cmd) { OLED_DC_L; OLED_CS_L; spi_read_write(cmd); OLED_CS_H; } /******************************************************************* * 函数名: OLED_Setpos() * 功能描述 : OLED设置位置 * 作者: 何文宾 * 参数说明: 待发送的指令 * 返回值说明: * 修改记录: * 其他: *******************************************************************/ void OLED_Setpos(u8 sx,u8 sy) { Oled_Write_Cmd(0xb0+sy); //哪一页 Oled_Write_Cmd(0x10+(sx>>4)); //高4位地址 Oled_Write_Cmd(0x00+(sx&0x0f));//低4位地址 } /******************************************************************* * 函数名: OLED_Clear() * 功能描述 : OLED设置位置 * 作者: 何文宾 * 参数说明: 待发送的指令 * 返回值说明: * 修改记录: * 其他: *******************************************************************/ void OLED_Clear(u8 sx,u8 ex,u8 sy,u8 ey,u8 data) { u8 i,j; for(i=sy;i<ey;i++) //页 { Oled_Write_Cmd(0xb0+i); //哪一页 Oled_Write_Cmd(0x10+(sx>>4)); //高4位地址 Oled_Write_Cmd(0x00+(sx&0x0f));//低4位地址 for(j=0;j<(ex-sx);j++) //列 { Oled_Write_Data(data); } } } /******************************************************************* * 函数名: OLED_ShowChar() * 功能描述 : 显示字符 * 作者: 何文宾 * 参数说明: x:X坐标,y:Y坐标,p:显示的字符,size:字符大小 * 返回值说明: * 修改记录: * 其他: *******************************************************************/ void OLED_ShowChar(u8 x,u8 y,u8 p,u8 size) { u8 i; u8 ex,ey; u8 res=p-' '; ex=x;ey=y; if(size==16) { OLED_Setpos(ex,ey); for(i=0;i<16;i++) { if(((i%8)==0)&&(i!=0)) { ex=x; ey+=1; OLED_Setpos(ex,ey); } Oled_Write_Data(char16X16[res][i]); } } else if(size==12) { OLED_Setpos(ex,ey); for(i=0;i<12;i++) { if(((i%6)==0)&&(i!=0)) { ex=x; ey+=1; OLED_Setpos(ex,ey); } Oled_Write_Data(char12X12[res][i]); } } else if(size==24) { OLED_Setpos(ex,ey); for(i=0;i<36;i++) { if(((i%12)==0)&&(i!=0)) { ex=x; ey+=1; OLED_Setpos(ex,ey); } Oled_Write_Data(char24X24[res][i]); } } } /******************************************************************* * 函数名: OLED_ShowString() * 功能描述 : 显示字符串 * 作者: 何文宾 * 参数说明: x:X坐标,y:Y坐标,p:显示的字符串,size:字符串大小 * 返回值说明: * 修改记录: * 其他: *******************************************************************/ void OLED_ShowString(u8 x,u8 y,u8 *p,u8 size) { while(*p!='\0') { OLED_ShowChar(x,y,*p,size); p+=1; x+=(size/2); } } /******************************************************************* * 函数名: OLED_ShowNum() * 功能描述 : 显示数字 * 作者: 何文宾 * 参数说明: x:X坐标,y:Y坐标,num:显示的数字,size:数字大小,len:长度 * 返回值说明: * 修改记录: * 其他: *******************************************************************/ void OLED_ShowNum(u8 x,u8 y,u32 num,u8 size) { u8 cnum,cnum2; u8 nn; u8 i; u8 length=0; nn=1; cnum=num; cnum2=num; if(num!=0) { while(num>0) { length+=1; num/=10; } } else { length=1; } while(length) { for(i=0;i<(length-1);i++) { nn=nn*10; } cnum=cnum/nn; OLED_ShowChar(x,y,cnum+48,size); x+=(size/2); cnum=cnum2%nn; nn=1; length--; } } /******************************************************************* * 函数名: OLED_ShowTime() * 功能描述 : 显示当前时间 * 作者: 何文宾 * 参数说明: x:X坐标,y:Y坐标,size:数字大小 * 返回值说明: * 修改记录: * 其他: *******************************************************************/ void OLED_ShowTime(u8 x,u8 y,u8 size) { u8 sx=x; /*显示当前时间*/ RTC_Get_Time(); OLED_ShowNum(sx,y,my_time.hour,16); sx+=size; OLED_ShowChar(sx,y,':',16); sx+=(size/2); OLED_ShowNum(sx,y,my_time.min,16); sx+=size; OLED_ShowChar(sx,y,':',16); sx+=(size/2); OLED_ShowNum(sx,y,my_time.sec ,16); } /******************************************************************* * 函数名: OLED_Showpic() * 功能描述 : 显示图片 * 作者: 何文宾 * 参数说明: * 返回值说明: * 修改记录: * 其他: *******************************************************************/ void OLED_Showpic(u8 sx,u8 sy,u8 ex,u8 ey,const unsigned char * p) { u8 i,j; for(j=0;j<(ey-sy);j++) { OLED_Setpos(sx,sy+j); for(i=0;i<(ex-sx);i++) { Oled_Write_Data(*p); p++; } } } /******************************************************************* * 函数名: OLED_Show_Font() * 功能描述 : 显示单个汉字 * 作者: 何文宾 * 参数说明: * 返回值说明: * 修改记录: * 其他: *******************************************************************/ void OLED_Show_Font(u8 x,u8 y,u8 size,u8 num) { u8 i; u8 temp; u8 ssize; u8 x0=x; u8 *zk; ssize=size*(size/8+(size%8?1:0)); //计算不同字体大小所占用的字节数 switch(size) { case 12: zk=(u8*)F12X12[num]; //得到汉字编号对应的点阵库 for(i=0;i<ssize;i++) { if(i==size) { x=x0; y++; } temp=zk[i]; //得到点阵数据 OLED_Setpos(x,y); Oled_Write_Data(temp); x++; } break; case 16: zk=(u8*)F16X16[num]; //得到汉字编号对应的点阵库 for(i=0;i<ssize;i++) { if(i==size) { x=x0; y++; } temp=zk[i]; //得到点阵数据 OLED_Setpos(x,y); Oled_Write_Data(temp); x++; } break; case 24: zk=(u8*)F24X24[num]; //得到汉字编号对应的点阵库 for(i=0;i<ssize;i++) { if(i==size) { x=x0; y++; } temp=zk[i]; //得到点阵数据 OLED_Setpos(x,y); Oled_Write_Data(temp); x++; } break; default:break; } } /******************************************************************* * 函数名: OLED_Show_Font() * 功能描述 : 显示多个汉字 * 作者: 何文宾 * 参数说明: * 返回值说明: * 修改记录: * 其他: *******************************************************************/ void OLED_ShowMultiple_Font(u8 x,u8 y,u8 size,u8 *p) { while(*p!=0) { OLED_Show_Font(x,y,size,*p); p++; x+=size; } } /******************************************************************* * 函数名: OLED_Show_gezi() * 功能描述 : 显示下划线 * 作者: 何文宾 * 参数说明: mode:1 密码格子 0:时间格子 * 返回值说明: * 修改记录: * 其他: *******************************************************************/ void OLED_Show_gezi(u8 sx,u8 sy,u8 ex,u8 ey) { u8 i; for(i=0;i<6;i++) { OLED_Showpic(sx,sy,ex,ey,&gezi[0]); sx+=15; ex+=15; } } void show_voice(u8 sx,u8 sy,u8 vol) { u8 i=0; u8 x=sx; OLED_Clear(sx,sx+80,sy,sy+1,0x00); for(i=0;i<vol;i++) { OLED_Showpic(x,sy,x+8,sy+1,&voice[i][0]); x+=10; } } /*********************************************************************************************** ***********************************************************************************************/ 我想在此基础上添加切换屏幕的功能,并且屏幕显示请输入密码

struct node { char path[1024]; struct node *next; struct node *prev; }; static const char * getenv_default(const char * name, const char * dflt) { return getenv(name) ?: dflt; } #if LV_USE_LINUX_FBDEV static void lv_linux_disp_init(void) { const char * device = getenv_default("LV_LINUX_FBDEV_DEVICE", "/dev/fb0"); lv_display_t * disp = lv_linux_fbdev_create(); lv_linux_fbdev_set_file(disp, device); } #elif LV_USE_LINUX_DRM static void lv_linux_disp_init(void) { const char * device = getenv_default("LV_LINUX_DRM_CARD", "/dev/dri/card0"); lv_display_t * disp = lv_linux_drm_create(); lv_linux_drm_set_file(disp, device, -1); } #elif LV_USE_SDL static void lv_linux_disp_init(void) { const int width = atoi(getenv("LV_SDL_VIDEO_WIDTH") ?: "800"); const int height = atoi(getenv("LV_SDL_VIDEO_HEIGHT") ?: "480"); lv_sdl_window_create(width, height); } #else #error Unsupported configuration #endif lv_obj_t *btn; lv_obj_t *btn1; lv_obj_t *btn2; lv_obj_t *btn3; struct node *pos = NULL; struct node * up_showpic(){ lv_obj_t *img1 = lv_image_create(lv_screen_active()); pos = pos -> prev; char path[1024]; char ch = 'A'; sprintf(path,"%c:%s",ch,pos->path); lv_image_set_src(img1,path); return pos; } struct node * down_showpic(){ lv_obj_t *img1 = lv_image_create(lv_screen_active()); pos = pos -> next; char path[1024]; char ch = 'A'; sprintf(path,"%c:%s",ch,pos->path); lv_image_set_src(img1,path); return pos; } static void button_cb(lv_event_t *e){ void *obj = lv_event_get_target(e); printf("按钮被点击%p\n",obj); struct node*pos = NULL; if(btn == obj){ printf("往上切换图片\n"); pos = up_showpic(); } else if(btn1 == obj){ printf("往下切换图片\n"); pos = down_showpic(); } else if(btn2 == obj){ lv_obj_t *img1 = lv_image_create(lv_screen_active()); char path[1024]; char ch = 'A'; sprintf(path,"%c:%s",ch,pos->path); printf("放大图片\n"); lv_image_set_scale(path,256); } else if(btn3 == obj){ printf("缩小图片\n"); } }放大图片时为什么会段错误

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="pic.aspx.cs" Inherits="WebApplication3.pic" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form id="form1" runat="server"> <asp:HyperLink ID="HyperLink1" runat="server" Target="_blank">HyperLink</asp:HyperLink>
<asp:HyperLink ID="HyperLink2" runat="server">HyperLink</asp:HyperLink>
<asp:HyperLink ID="HyperLink3" runat="server">HyperLink</asp:HyperLink>
</form> </body> </html> using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebApplication3 { public partial class pic : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { HyperLink1.ImageUrl = "~/images/4.gif"; HyperLink1.NavigateUrl = "~/showpic.aspx"; } } }<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="showpic.aspx.cs" Inherits="WebApplication3.showpic" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form id="form1" runat="server"> <asp:Image ID="Image1" runat="server" Height="273px" Width="384px" /> </form> </body> </html> 如何修改CS代码才能实现:在pic.aspx中用HyperLink控件显示小图片列表(如三张图片),以网址参数的形式链接到showpic.aspx页面,并在showpic.aspx显示相应的大图片。

最新推荐

recommend-type

layui表格数据复选框回显设置方法

[{ type: 'checkbox' }, { field: 'id', title: '话题ID', width: 80 }, { field: 'image_url', title: '图片', width: 100, templet: "#showPic" }, { field: 'content', title: '话题内容', width: 260 }, { ...
recommend-type

双向CLLLC谐振闭环仿真设计与软开关技术实现:高压侧与低压侧波形优化及软开关性能研究 · 谐振波形优化

内容概要:本文介绍了双向CLLLC谐振技术及其在电力电子领域的应用,重点讨论了软开关和谐振波形的优化设计。文中首先简述了CLLLC谐振技术的基本原理,然后详细描述了在一个仿真环境下构建的双向CLLLC谐振系统,该系统能够在广泛的电压范围内(高压侧380-430V,低压侧40-54V)实现过谐振、欠谐振及满载轻载情况下的软开关。此外,文章展示了理想的谐振波形,并强调了软开关对减少开关损耗和电磁干扰的重要性。最后,文章提到可以通过参考相关文献深入了解系统的电路设计、控制策略和参数优化。 适合人群:从事电力电子设计的研究人员和技术工程师。 使用场景及目标:适用于需要理解和掌握双向CLLLC谐振技术及其仿真设计的专业人士,旨在帮助他们提升电源转换和能量回收系统的性能。 其他说明:文中提供的代码片段和图示均为假设的仿真环境,实际应用时需根据具体情况调整。建议参考相关文献获取更详尽的设计细节。
recommend-type

操作系统原理-PPT(1).ppt

操作系统原理-PPT(1).ppt
recommend-type

计算机网络期末考试试卷B-及答案试卷教案(1).doc

计算机网络期末考试试卷B-及答案试卷教案(1).doc
recommend-type

基于STM32的USB简易鼠标[最终版](1).pdf

基于STM32的USB简易鼠标[最终版](1).pdf
recommend-type

精选Java案例开发技巧集锦

从提供的文件信息中,我们可以看出,这是一份关于Java案例开发的集合。虽然没有具体的文件名称列表内容,但根据标题和描述,我们可以推断出这是一份包含了多个Java编程案例的开发集锦。下面我将详细说明与Java案例开发相关的一些知识点。 首先,Java案例开发涉及的知识点相当广泛,它不仅包括了Java语言的基础知识,还包括了面向对象编程思想、数据结构、算法、软件工程原理、设计模式以及特定的开发工具和环境等。 ### Java基础知识 - **Java语言特性**:Java是一种面向对象、解释执行、健壮性、安全性、平台无关性的高级编程语言。 - **数据类型**:Java中的数据类型包括基本数据类型(int、short、long、byte、float、double、boolean、char)和引用数据类型(类、接口、数组)。 - **控制结构**:包括if、else、switch、for、while、do-while等条件和循环控制结构。 - **数组和字符串**:Java数组的定义、初始化和多维数组的使用;字符串的创建、处理和String类的常用方法。 - **异常处理**:try、catch、finally以及throw和throws的使用,用以处理程序中的异常情况。 - **类和对象**:类的定义、对象的创建和使用,以及对象之间的交互。 - **继承和多态**:通过extends关键字实现类的继承,以及通过抽象类和接口实现多态。 ### 面向对象编程 - **封装、继承、多态**:是面向对象编程(OOP)的三大特征,也是Java编程中实现代码复用和模块化的主要手段。 - **抽象类和接口**:抽象类和接口的定义和使用,以及它们在实现多态中的不同应用场景。 ### Java高级特性 - **集合框架**:List、Set、Map等集合类的使用,以及迭代器和比较器的使用。 - **泛型编程**:泛型类、接口和方法的定义和使用,以及类型擦除和通配符的应用。 - **多线程和并发**:创建和管理线程的方法,synchronized和volatile关键字的使用,以及并发包中的类如Executor和ConcurrentMap的应用。 - **I/O流**:文件I/O、字节流、字符流、缓冲流、对象序列化的使用和原理。 - **网络编程**:基于Socket编程,使用java.net包下的类进行网络通信。 - **Java内存模型**:理解堆、栈、方法区等内存区域的作用以及垃圾回收机制。 ### Java开发工具和环境 - **集成开发环境(IDE)**:如Eclipse、IntelliJ IDEA等,它们提供了代码编辑、编译、调试等功能。 - **构建工具**:如Maven和Gradle,它们用于项目构建、依赖管理以及自动化构建过程。 - **版本控制工具**:如Git和SVN,用于代码的版本控制和团队协作。 ### 设计模式和软件工程原理 - **设计模式**:如单例、工厂、策略、观察者、装饰者等设计模式,在Java开发中如何应用这些模式来提高代码的可维护性和可扩展性。 - **软件工程原理**:包括软件开发流程、项目管理、代码审查、单元测试等。 ### 实际案例开发 - **项目结构和构建**:了解如何组织Java项目文件,合理使用包和模块化结构。 - **需求分析和设计**:明确项目需求,进行系统设计,如数据库设计、系统架构设计等。 - **代码编写和实现**:根据设计编写符合要求的代码,实现系统的各个模块功能。 - **测试和维护**:进行单元测试、集成测试,确保代码质量,对项目进行维护和升级。 ### 其他相关知识点 - **Java虚拟机(JVM)**:了解JVM的基本工作原理,包括类加载机制、内存管理、垃圾回收算法等。 - **常用Java框架**:比如Spring、Hibernate、MyBatis等,在实际开发中常常与Java基础结合使用,提高开发效率。 以上知识点可以作为学习Java案例开发的基础框架。在实际的开发实践中,开发者需要结合具体的项目需求,对这些知识点进行灵活运用。通过反复的案例实践,可以加深对Java编程的理解,并逐步提升开发技能。这份集锦可能包含的案例可能涉及上述知识点的具体应用,能够帮助学习者更好地理解理论与实践的结合,从而快速提升个人的Java开发能力。
recommend-type

【VASP报错深度解析】:5大技巧识别并永久解决离子距离太近警告

# 1. VASP软件简介及离子距离太近问题概述 ## 1.1 VASP软件简介 **VASP(Vienna Ab initio Simulation Package)** 是一款广泛应用于计算材料科学的软件,它基于密度泛函理论(DFT)计算固体、表面和分子的电子结构和性质。
recommend-type

npm error A complete log of this run can be found in: D:\Program Files\nodejs\node_cache\_logs\2025-04-20T15_11_51_454Z-debug-0.log

<think>好的,我需要帮助用户找到npm的错误调试日志位置,并解决他们遇到的npm错误。首先,用户已经提供了一个具体的日志路径:'D:\Program Files\nodejs\node_cache\_logs\2025-04-20T15_11_51_454Z-debug-0.log',但看起来这个路径可能有问题,因为日期是2025年,这可能是一个示例或输入错误。我需要确认正确的日志路径生成方式。 根据npm的默认配置,日志文件通常位于npm的缓存目录下的_logs文件夹中。默认情况下,Windows系统中npm的缓存路径是%AppData%\npm-cache,而日志文件会以当前日期和
recommend-type

深入理解内存技术文档详解

由于文件内容无法查看,仅能根据文件的标题、描述、标签以及文件名称列表来构建相关知识点。以下是对“内存详解”这一主题的详细知识点梳理。 内存,作为计算机硬件的重要组成部分,负责临时存放CPU处理的数据和指令。理解内存的工作原理、类型、性能参数等对优化计算机系统性能至关重要。本知识点将从以下几个方面来详细介绍内存: 1. 内存基础概念 内存(Random Access Memory,RAM)是易失性存储器,这意味着一旦断电,存储在其中的数据将会丢失。内存允许计算机临时存储正在执行的程序和数据,以便CPU可以快速访问这些信息。 2. 内存类型 - 动态随机存取存储器(DRAM):目前最常见的RAM类型,用于大多数个人电脑和服务器。 - 静态随机存取存储器(SRAM):速度较快,通常用作CPU缓存。 - 同步动态随机存取存储器(SDRAM):在时钟信号的同步下工作的DRAM。 - 双倍数据速率同步动态随机存取存储器(DDR SDRAM):在时钟周期的上升沿和下降沿传输数据,大幅提升了内存的传输速率。 3. 内存组成结构 - 存储单元:由存储位构成的最小数据存储单位。 - 地址总线:用于选择内存中的存储单元。 - 数据总线:用于传输数据。 - 控制总线:用于传输控制信号。 4. 内存性能参数 - 存储容量:通常用MB(兆字节)或GB(吉字节)表示,指的是内存能够存储多少数据。 - 内存时序:指的是内存从接受到请求到开始读取数据之间的时间间隔。 - 内存频率:通常以MHz或GHz为单位,是内存传输数据的速度。 - 内存带宽:数据传输速率,通常以字节/秒为单位,直接关联到内存频率和数据位宽。 5. 内存工作原理 内存基于电容器和晶体管的工作原理,电容器存储电荷来表示1或0的状态,晶体管则用于读取或写入数据。为了保持数据不丢失,动态内存需要定期刷新。 6. 内存插槽与安装 - 计算机主板上有专用的内存插槽,常见的有DDR2、DDR3、DDR4和DDR5等不同类型。 - 安装内存时需确保兼容性,并按照正确的方向插入内存条,避免物理损坏。 7. 内存测试与优化 - 测试:可以使用如MemTest86等工具测试内存的稳定性和故障。 - 优化:通过超频来提高内存频率,但必须确保稳定性,否则会导致数据损坏或系统崩溃。 8. 内存兼容性问题 不同内存条可能由于制造商、工作频率、时序、电压等参数的不匹配而产生兼容性问题。在升级或更换内存时,必须检查其与主板和现有系统的兼容性。 9. 内存条的常见品牌与型号 诸如金士顿(Kingston)、海盗船(Corsair)、三星(Samsung)和芝奇(G.Skill)等知名品牌提供多种型号的内存条,针对不同需求的用户。 由于“内存详解.doc”是文件标题指定的文件内容,我们可以预期在该文档中将详细涵盖以上知识点,并有可能包含更多的实践案例、故障排查方法以及内存技术的最新发展等高级内容。在实际工作中,理解并应用这些内存相关的知识点对于提高计算机性能、解决计算机故障有着不可估量的价值。
recommend-type

【机械特性分析进阶秘籍】:频域与时域对比的全面研究

# 1. 机械特性分析的频域与时域概述 ## 1.1 频域与时域分析的基本概念 机械特性分析是通