前言

喜欢看动漫的朋友们大概都能体会到一个难受的事情,就是在论坛或者群聊里面看到一张动漫截图,很想知道它的出处,但百度搜了一圈却也没有一个可靠结果,就很郁闷。今天就来带大家用Python做一个简单的“以图搜番”小应用。应用本身的实现不是很难的事情,其实就是调用别人的API接口来实现,主要目的还是通过这个案例来学习以下内容:「学习如何用PyQt5做用户交互界面(UI)」;

「学习如何使用Nuitka打包程序为exe文件」;

PyQt5界面设计

如果用 Python 语言开发 「跨平台」 的图形界面的程序,主要有3种选择:「Tkinter」:基于Tk的Python库,这是Python官方采用的标准库,优点是作为Python标准库、稳定、发布程序较小,缺点是控件相对较少。

「wxPython」:基于wxWidgets的Python库,优点是控件比较丰富,缺点是稳定性相对差点、文档少、用户少。

「PyQt5」(或者PySide2):基于Qt 的Python库,优点是控件比较丰富、跨平台体验好、文档完善、用户多。缺点是库比较大,发布出来的程序比较大。

本教程使用的就是PyQt5,它是Digia的一套Qt5应用框架与python的结合,同时支持2.x和3.x。本教程使用的是3.x。Qt库由Riverbank Computing开发,是最强大的GUI库之一 ,官方网站:https://www.riverbankcomputing.com/software/pyqt/。 PyQt5是由一系列Python模块组成。超过620个类,6000函数和方法。能在诸如Unix、Windows和Mac OS等主流操作系统上运行。PyQt5有两种证书,GPL和商业证书。 安装方法:pip install PyQt5

使用Qt Designer绘制界面

在设计一个图形化界面的应用时,我们需要先绘制出其大致布局,可以在草稿纸上勾勒一下,然后通过PyQt5中的Qt Designer应用来设计,它的文件名叫designer.exe,找不到位置可以在本地文件中搜索一下:

下图为本应用的一个界面初步设计,通过标注的四个区域相互配合,即可完成一个UI设计,该工程会保存为一个.ui后缀名的UI文件,最好放在Python代码文件一起。本次界面设计并不复杂,两个按钮,一个打开图片,另一个点击后开始查询;一个QComboBox部件,用于选择备选结果;一个图片显示区域,显示打开的查询图片,一个结果显示区域,显示查询结果具体内容。界面下面是视频显示区域,即该图片出现在原动画中的视频片段。

具体的Qt Designer基本使用方法我就不在这里展开了,如果你第一次用,可以参考这个入门视频教程:https://www.bilibili.com/video/BV1cJ411R7bP ,讲得还挺好,我就是跟着这个视频入门学习的。它的文字版教程在这里:http://www.python3.vip/tut/py/gui/qt_01/

我是使用的VSCode编辑器,推荐一个插件——PYQT Integration,可以随时预览UI界面和编辑UI界面,也很方便把UI文件转换成Python代码。

视频部件插入小技巧

在UI界面中加一个视频显示部分我花了不少时间去研究,主要「因为Qt Designer中没有视频播放器的小部件」,于是我就有点懵了,虽然可以直接编辑Python代码来弄,但为了统一流程,还是希望能在Qt Designer中布置好。经过一番研究,总结以下方法:

「第一步」:拖拽一个Containers中的Widget到编辑界面;

「第二步」:选择Widget部件,右键选择“提升为...(Promote to ...)”;

「第三步」:设置“提升的类名称”为QVideoWidget,“头文件”为PyQt5.QtMultimediaWidgets

「第四步」:点击添加,然后点击提升。 反应到编译的Python代码中,其实就是增加了一句from PyQt5.QtMultimediaWidgets import QVideoWidget

from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer

# 首先初始化一个mediaPlayer

self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

self.mediaPlayer.setVideoOutput(self.ui.VideoDisplay)

# 在需要使用这个mediaPlayer的函数中,从本地打开视频并播放

self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(file_name)))

self.mediaPlayer.play()

解码器下载

另外,需要下载一个解码器,不然播放mp4视频的时候会如下图一样报错。解码器的话下载安装 LAV 解码器就好,下载地址:LAV 0.74.1: Installer (both x86/x64)

功能实现

trace.moe API介绍与视频

它背后的实现依靠的是「大数据+基于内容的图像检索」(Content-based image retrieval ,CBIR),“基于内容”意味着搜索分析图像的内容,而不是与图像相关的元数据,如关键字、标签或描述。术语“内容”在这个上下文中可能指的是颜色、形状、纹理或任何其他可以从图像本身衍生出来的信息。CBIR使用起来比较方便,因为它不需要标注信息,而纯粹依赖元数据的搜索依赖于标注的质量和完整性。wikipedia上有列出很多CBIR engines,trace.moe则使用了Lire。对于图像的描述,trace.moe则仅仅使用了颜色布局(Color Layout )。另一方面就是大数据,其背后的数据支撑为30096小时的视频内容(大约26亿帧),来自于3194部动画,大约18.1 TB大小。7.46亿帧索引(重复数据删除后),数据库大小为140 GB。具体实现细节可以参考:trace.moe slide和trace.moe github 项目。

如果你不关心实现细节,可以直接看下面的API接口使用。

import requests

img_path = 'xxx.png'

traceMoe_api = "https://trace.moe/api/search"

files = {"image": ('anime.png', open(img_path, 'rb'))}

res = requests.post(traceMoe_api, files=files)

返回一个json结果,内容如下:

其中docs则包含了可能的结果,其内容如下:

得到这些内容后,就可以下载对应的视频片段:

url = f"https://trace.moe/preview.php?anilist_id={item['anilist_id']}&file={item['filename']}&t={item['at']}&token={item['tokenthumb']}"

video = requests.get(url)

with open(item['filename'], 'wb') as f:

f.write(video.content)

当然,也不是每天无限制请求的,普通用户每天只能查询150次

使用Nuitka打包成exe文件

Nuitka的作用是将Python程序转换成C语言的可执行elf文件。这样在运行时就可以享受到C语言处理过程中的优化,提高速度。经测试,Nuitka打包后的exe比Pyinstaller打包后的exe运行速度提升30%,PyQT5的UI文件转换成py文件转换成C语言后,界面秒开呀。 「第一步」:下载MinGW64 8.1,解压文件到C盘根目录,并将bin路径加入到环境变量中。然后安装Nuitka:pip install nuitka;

这样就表示成功了:

❝ import的系统库,使用python3x.dll来执行,其他自己实现的UI界面和数据库的连接以及函数和功能实现,需要加密(反编译)和快速反应的,用户的体验就在这里,这部分借助Nuitka来实现。 以下是Nuitka的关键命令段: 「--nofollow-imports #所有的import全部不使用,交给python3x.dll执行

--follow-import-to=need #need为你需要编译成C/C++的py文件夹命名」 ——引用自:Python打包exe(32/64位)-Nuitka再下一城

「第二步」:调试阶段,逐个加入所需的轮子文件: 首先运行

nuitka --standalone --mingw64 --show-memory --show-progress --nofollow-imports --plugin-enable=qt-plugins --follow-import-to=need --output-dir=output app_main.py

然后运行output\app_main.dist中的app_main.exe,逐个找到缺的轮子的文件,并加入到output\app_main.dist目录下,如下图,表明缺少requests等库,则可以利用Everything,XSearch等软件快速定位文件所在地(关注公众号:野风同学,回复“文件查找”即可获取软件)。加到可以运行为止。「记住把这些库文件单独另外找一个文件夹放着,后面需要复制到正式输出的文件夹中」。

「第三步」:生成阶段, 运行 nuitka --standalone --windows-disable-console --mingw64 --nofollow-imports --show-memory --show-progress --plugin-enable=qt-plugins --follow-import-to=need --recurse-all --output-dir=output app_main.py,然后将刚刚找到库文件复制到app_main.dist文件夹下。这样就基本完成了打包,进入app_main.dist中,点击app_main.exe即可运行(前提是安装了LAV 解码器,不然视频不会显示!)。

下面演示一下:知乎视频​www.zhihu.com

python可以做动漫吗_用Python做一个以图搜番的应用程序,再也不用愁动漫图片的出处了!...相关推荐

  1. 用Python做一个“以图搜番“的应用程序,再也不用愁动漫图片的出处了!

    文章目录 前言 PyQt5界面设计 使用Qt Designer绘制界面 视频部件插入小技巧 解码器下载 功能实现 trace.moe API介绍与视频 使用Nuitka打包成exe文件 前言 喜欢看动 ...

  2. 无法检索数据和目标数据的列信息_使用AnalyticDB轻松实现以图搜图和人脸检索...

    1. 背景 以图搜图在生活中有着广泛的应用, 当我们在电视上看到有人穿着一件美丽的裙子或者帅气的球鞋也想拥有时, 我们可以拍张照片然后打开淘宝然后上传照片就可以快速的找到这个商品. 我们看到一张电影截 ...

  3. python处理视频动漫化_用Python实现抖音上的“人像动漫化”特效,原来这么简单...

    原标题:用Python实现抖音上的"人像动漫化"特效,原来这么简单 作者 | 黄伟呢 来源 | 数据分析与统计学之美 前几天,女友拉着我和她玩儿抖音,就是这个 人像动漫化的操作,顿 ...

  4. python做审计底稿视频_最新Python教学视频,每天自学俩小时,让你offer拿到手软...

    2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...

  5. python人工智能 动漫生成_用 Python 实现抖音上的“人像动漫化”特效,原来这么简单!...

    作者 | 黄伟呢 来源 | 数据分析与统计学之美前几天,女友拉着我和她玩儿抖音,就是这个人像动漫化的操作,顿时觉得很好玩儿.我心想:Python 既然这么强大,是不是也可以使用 Python 程序来实 ...

  6. python标准输入输出用来干什么_学习Python主要是用来做什么的?

    原标题:学习Python主要是用来做什么的? 虽然程序员不会有女朋友,但是这个也可以用在同性朋友身上哦. 再也不用担心工作忙,没法经常和她/他/它聊天了. 可以实时知道女友的情感情绪指数,再也不用担心 ...

  7. python的变量名有哪些_【python字符串做变量名的方法有哪些?这些方法对python应用很重要】- 环球网校...

    [摘要]python的功能都是建立在代码之上的,不过你知道python字符串做变量名的方法有哪些?这些方法对python应用很重要,如果你想学好python,那么本文内容一定要自己试试,毕竟实践出真知 ...

  8. python编程能有什么用_揭秘python都能做什么?

    Python作为一种功能强大,并井且简单易学的编程语言而广受好评,那么Python都能做么?概据起来有以下几个方面. Wob开发使用Python的二个基本应用就是进行Web开发,在国内,大一些的使用P ...

  9. python 接口自动化的sql验证_基于Python的接口自动化实战-基础篇之pymysql模块操做数据库...

    引言 在进行功能或者接口测试时经常须要经过链接数据库,操做和查看相关的数据表数据,用于构建测试数据.核对功能.验证数据一致性,接口的数据库操做是否正确等.所以,在进行接口自动化测试时,咱们同样绕不开接 ...

最新文章

  1. linux下安装nginx、python、django
  2. 霸气侧漏HTML5--之--canvas(1) api + 弹球例子
  3. you think you know javascript
  4. 利用自己的电脑设置web服务器建网站_win7系统篇,win7系统利用iis搭建web服务器实现信息浏览资源共享的操作方法...
  5. HDU5977 Garden of Eden 【FMT】【树形DP】
  6. oracle 10g客户端连接11g,生产环境oracle10g升级至11g准备工作
  7. Hibernate ‍java.lang.ClassCastException ERROR解决方法
  8. 标图123123666
  9. 数据库查询·聚合分支格式化日期·思维导图要点误点(含示例)
  10. python开发的网络调试助手_Linux/windows/mac 下的socket网络通信调试助手 UDP/TCP
  11. iOS Firebase如何上传.dSYM包
  12. KeilC51版与KeilMDK版合并
  13. js实现定时弹出广告效果
  14. go 连接服务器 并存放图片_[本站大事件] 又更换服务器了 – 小文's blog
  15. 台达变频器s1参数设置_台达变频器的参数设定步骤
  16. yarn : 无法加载文件 C:\Users\wangxin67\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.mic
  17. Redis 发布订阅原理以及springboo中RedisTemplate集成
  18. Linux之LVM篇
  19. delete、truncate 、Drop删除表的区别
  20. 【新番尝鲜】白色相簿——我的女朋友是偶像?

热门文章

  1. Maven使用ActiveMQ
  2. 把CDLinux制作成U盘启动
  3. java ajax提交form表单提交_form表单AJAX提交(四种方法)
  4. excel怎么启用宏_#数据同步#Excel + mysql 制作自动化报表
  5. 我又被google愚了一把
  6. 魔兽世界python脚本拍卖行_利用python脚本进行资产监测
  7. 删除系统保留盘的方法
  8. python系统函数教程_Python入门基础教程之Python内置函数
  9. [CTSC2018]青蕈领主
  10. Webstorm 常用技巧