本帖最后由 qrm 于 2023-10-28 12:35 编辑
程序和使用教程放后面啦!务必仔细查看!
起初,灵感来源于网络上一些视频,伴随着Shed A Light的音乐,在一片白屏中,原神图标缓缓显现......
可是,这些都只是视频。可不可以制作一个程序,在检测到电脑白屏时,自动播放启动画面呢?
——原神自动启动器应运而生
首先,我设想使用pyautogui逐个获取每个像素点再叠加亮度
经过实践,1920x1080的屏幕,光是扫描一行就要10秒,1080行就是3个小时!
好吧,问ChatGPT,给出了解决方案:
使用mss来进行快速的屏幕截取,cv2进行图像转化,最后使用numpy对图像进行高效处理
源代码如下:(这里似乎不能缩进,看看就行)
- import mss
- import numpy as np
- import cv2
- import pyautogui
- import pygame
- import time
- import ctypes
-
- file = open("GALS.txt", 'r') # 打开文件
- setting_dict = file.read() # 读取文件内容
- file.close() # 关闭文件
- # 设置变量
- setting_dict = eval(setting_dict)
- launch_value = setting_dict["launch_value"]# 触发阈值
- front_shake = setting_dict["front_shake"]# 前摇时长
- change_time = setting_dict["change_time"]# 渐变间隔时间
- back_shake = setting_dict["back_shake"]# 后摇时长
-
-
- screen_width, screen_height = pyautogui.size()# 获取屏幕大小
- pygame.init()
- image = pygame.image.load("GALP.png")
- image.set_colorkey((255, 255, 255)) # 设置白色为色彩关键词(透明度)
- # 计算图片绘制的位置
- image_width, image_height = image.get_size()
- pic_x = (screen_width - image_width) // 2
- pic_y = (screen_height - image_height) // 2
-
-
- # 创建MSS(Multiple Screen Shots)对象
- with mss.mss() as sct:
- while True:
- # 设置截取区域为整个屏幕
- monitor = {"top": 0, "left": 0, "width": screen_width, "height": screen_height}
- # 截取屏幕图像
- screenshot = np.array(sct.grab(monitor))
- # 将图像转换为灰度图像
- gray_image = cv2.cvtColor(screenshot, cv2.COLOR_BGR2GRAY)
- # 计算灰度图像的总亮度
- total_brightness = np.sum(gray_image)
- # 如果超过阈值,创建屏幕,将其提到最上层
- if total_brightness >= launch_value:
- flags = pygame.DOUBLEBUF | pygame.HWSURFACE | pygame.FULLSCREEN | pygame.NOFRAME
- screen = pygame.display.set_mode((screen_width, screen_height), flags)
- hwnd = pygame.display.get_wm_info()["window"]
- screen.fill((255, 255, 255))
- pygame.display.flip()
- ctypes.windll.user32.SetWindowPos(hwnd, -1, 0, 0, 0, 0, 0x0001)
- time.sleep(front_shake)
- # 原神,启动!(透明度逐渐降低)
- for alpha in range(0,100):
- image.set_alpha(alpha)
- screen.blit(image, (pic_x, pic_y))
- pygame.display.flip()
- time.sleep(change_time)
- time.sleep(back_shake)
- pygame.quit()
- # 防止一直启动,亮度降下来后再开始下一次循环
- while total_brightness >= launch_value * 0.98:
- monitor = {"top": 0, "left": 0, "width": screen_width, "height": screen_height}
- # 截取屏幕图像
- screenshot = np.array(sct.grab(monitor))
- # 将图像转换为灰度图像
- gray_image = cv2.cvtColor(screenshot, cv2.COLOR_BGR2GRAY)
- # 计算灰度图像的总亮度
- total_brightness = np.sum(gray_image)
复制代码
让我们看看最终效果吧!
衔接非常丝滑!
抱歉,由于上传文件大小限制,我不能在帖子中直接上传,请点击链接下载
Genshin Automatic Launcher.zip
FORTEST.zip
如果下载链接无效看评论
-----------
使用方法:GALS.txt中的四个值分别代表着触发阈值、前摇时长、渐变间隔时间和后摇时长,可以修改,后三个单位为秒,已经帮调好了,可以不用改
触发阈值则要自己微调。方法如下:
打开FORTEST.exe,控制台输出的是最大亮度。接下来,将电脑屏幕搞成全白(推荐这个网址用于测试:屏幕检测工具),最后返回控制台窗口,最后一个值就是你电脑全白时的亮度啦!
注意,在设置触发阈值时,一般可以设置最大亮度为全白时亮度的98%效果更好,具体依个人而异
最后,双击打开GAL.exe,过几秒就好了,不会有提示(把这个程序设为开机自启动是个不错的选择哦)
如想关闭,在任务管理器里面将其关闭
再次提醒:双击,过几秒就自动打开了,只有在任务管理器中将其关闭
-----------
请仔细阅读使用说明!
软件本身无毒,杀毒软件会误报,请将软件添加到杀毒软件白名单
本程序为作者原创,如需转载请注明出处(https://mc.dfrobot.com.cn/thread-317041-1-1.html)
另外,程序如有任何问题或有疑问,随时都可以向我提出哟!
|