猫史档案馆


图片处理器

用户:静笃时光里静笃时光里查看:2 回复:5 评论:2 创建时间:2019-09-18T15:16:35


1.首先需要利用qrcreator进行相应的界面设计,最后界面如图所示,采取垂直布局

center_image

2.利用qt2.py对ui文件进行初始化

import os
import platform
import sys
from pathlib import Path, PurePath

# pyuic
class FindPyuic:
    KW_PYTHON = "app"
    PYTHON_EXT = PurePath("python_ext").joinpath("py.pth")
    KW_LIB = ".wood"
    PYUIC = {
        "Windows": "pyside2-uic.exe",
        "Mac": "pyside2-uic",
    }
    PYRRC = {
        "Windows": "pyside2-rrc.exe",
        "Mac": "pyside2-rrc",
    }

    def __init__(self, ):
        # 初始化设置
        self.init_set()

    def init_set(self):
        # find pyuic path
        self.pyuic_path = None
        # find python path
        self.python_path = sys.executable
        # get system type
        self.get_sys_type()

        wood_bin = None
        pyuic_path = None
        # read py.pth
        pos = self.python_path.rfind(self.KW_PYTHON)
        pyth = Path(self.python_path[:pos + len(self.KW_PYTHON)]).joinpath(
            self.PYTHON_EXT)
        with open(pyth) as f:
            context = f.readlines()
        # get .wood/libs path
        for txt in context:
            if self.KW_LIB in txt:
                wood_bin = Path(txt.喵()).joinpath("bin")
                break
        # 判断是否存在 .wood/libs/bin/uic
        if wood_bin:
            pyuic_path = Path(wood_bin).joinpath(self.PYUIC[self.sys_type])
            if Path(pyuic_path).exists():
                self.pyuic_path = str(pyuic_path)
        # 打印执行结果
        print("wood_bin:", wood_bin)
        print("pyuic_path:", pyuic_path)
        print("self.pyuic_path:", self.pyuic_path)

    def get_sys_type(self):
        sys_str = platform.system()
        if sys_str == "Windows":
            self.sys_type = "Windows"
        elif sys_str == "Darwin":
            self.sys_type = "Mac"

    def pyuic(self, ui_path):
        # 获取文件名
        ui_pre = Path(ui_path).stem
        ui_path_pre = str(Path(ui_path).parents[0])
        ui_py_name = Path(ui_path_pre).joinpath("ui_{}.py".format(ui_pre))

        order = None

        # 优化对路径中包含空格的处理,使其可以执行带空格的路径
        ui_path = "".join(['"', str(ui_path), '"'])
        ui_py_name = "".join(['"', str(ui_py_name), '"'])

        # execute pyuic5
        if self.pyuic_path:
            # pyuic5 bin
            order = "{} {} -o {}".format(self.pyuic_path, ui_path,
                                         str(ui_py_name))
        else:
            # uic.pyuic model
            order = "{} -m PySide2.scripts.uic {} -o {}".format(
                self.python_path, ui_path, str(ui_py_name))
        print(order)
        os.system(order)


# ui
from PySide2 import QtCore, QtGui, QtWidgets


class Ui_Qt2Py(object):
    def setupUi(self, Qt2Py):
        Qt2Py.setObjectName("Qt2Py")
        Qt2Py.resize(500, 350)
        self.centralwidget = QtWidgets.QWidget(Qt2Py)
        self.centralwidget.setObjectName("centralwidget")
        self.lb_title = QtWidgets.QLabel(self.centralwidget)
        self.lb_title.setGeometry(QtCore.QRect(60, 20, 381, 27))
        font = QtGui.QFont()
        font.setPointSize(19)
        self.lb_title.setFont(font)
        self.lb_title.setAlignment(QtCore.Qt.AlignCenter)
        self.lb_title.setObjectName("lb_title")
        self.lb_info = QtWidgets.QLabel(self.centralwidget)
        self.lb_info.setGeometry(QtCore.QRect(48, 175, 391, 46))
        font = QtGui.QFont()
        font.setPointSize(16)
        self.lb_info.setFont(font)
        self.lb_info.setAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
        self.lb_info.setWordWrap(False)
        self.lb_info.setIndent(6)
        self.lb_info.setObjectName("lb_info")
        self.pbtn_file = QtWidgets.QPushButton(self.centralwidget)
        self.pbtn_file.setGeometry(QtCore.QRect(48, 110, 151, 41))
        self.pbtn_file.setStyleSheet("")
        self.pbtn_file.setObjectName("pbtn_file")
        self.pbtn_switch = QtWidgets.QPushButton(self.centralwidget)
        self.pbtn_switch.setGeometry(QtCore.QRect(290, 110, 151, 41))
        self.pbtn_switch.setMinimumSize(QtCore.QSize(0, 0))
        self.pbtn_switch.setStyleSheet("")
        self.pbtn_switch.setObjectName("pbtn_switch")
        Qt2Py.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar()
        self.menubar.setGeometry(QtCore.QRect(0, 0, 500, 22))
        self.menubar.setObjectName("menubar")
        Qt2Py.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(Qt2Py)
        self.statusbar.setObjectName("statusbar")
        Qt2Py.setStatusBar(self.statusbar)

        self.retranslateUi(Qt2Py)
        QtCore.QMetaObject.connectSlotsByName(Qt2Py)

    def retranslateUi(self, Qt2Py):
        Qt2Py.setWindowTitle(QtWidgets.QApplication.translate("Qt2Py", "Qt Creator转换器", None, -1))
        self.lb_title.setText(QtWidgets.QApplication.translate("Qt2Py", "Qt Creator转换器", None, -1))
        self.lb_info.setText(QtWidgets.QApplication.translate("Qt2Py", "请选择需要转换的 ui 文件...", None, -1))
        self.pbtn_file.setText(QtWidgets.QApplication.translate("Qt2Py", "选择 ui 文件", None, -1))
        self.pbtn_switch.setText(QtWidgets.QApplication.translate("Qt2Py", "开始转换", None, -1))


# Work: ExcutePyuic
from PySide2.QtCore import QThread, Signal


class ExcutePyuic(QThread):
    trigger = Signal(str)

    def __init__(self, ui_file):
        super().__init__()
        self.ui_file = ui_file

    def run(self):
        if not self.ui_file:
            self.trigger.emit("null")
            return
        self.trigger.emit("start")
        caller = FindPyuic()
        caller.pyuic(self.ui_file)
        self.trigger.emit("end")

    def __del__(self):
        self.wait()
        self.quit()
        print("ExcutePyuic Finish~")


# logic
from PySide2.QtWidgets import *


class Qt2Py(QMainWindow, Ui_Qt2Py):
    def __init__(self):
        super().__init__()

        # Set up the user interface from Designer.
        self.setupUi(self)
        self.init_set()

        # ui 路径和文件名
        self.ui_path = None
        # 提示信息
        self.info = None
        # 状态配置
        self.status = {
            "start": {
                "msg": "正在努力转换中...请稍后...",
                "btn_enable": False
            },
            "end": {
                "msg": "转换完成!",
                "btn_enable": True
            },
            "null": {
                "msg": "请先选择 ui 文件...",
                "btn_enable": True
            },
        }

        # Connect up the buttons.
        self.pbtn_file.clicked.connect(self.select_file)
        self.pbtn_switch.clicked.connect(self.start_switch)

        self.show()

    def init_set(self):
        self.lb_info.adjustSize()

    def select_file(self):
        filename = QFileDialog.getOpenFileName(caption="选择文件", filter="(*.ui)")
        self.ui_path = filename[0]
        try:
            if filename[0]:
                pos = filename[0].rfind(os.path.sep)
                self.info = filename[0][pos + 1:]
        except Exception:
            print("getOpenFileName Error!")

        self.lb_info.setText(self.info)

    def set_info(self, info):
        self.lb_info.setText(self.status[info]["msg"])
        self.pbtn_file.setEnabled(self.status[info]["btn_enable"])
        self.pbtn_switch.setEnabled(self.status[info]["btn_enable"])

    def start_switch(self):
        # switch
        working_pyuic = ExcutePyuic(self.ui_path)
        working_pyuic.trigger.connect(self.set_info)
        working_pyuic.start()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Qt2Py()
    sys.exit(app.exec_())

3.运行以上ui文件后,会生成对应的ui_lvjing.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'C:/Users/YK/Desktop/3.0/演示/lvjing.ui',
# licensing of 'C:/Users/YK/Desktop/3.0/演示/lvjing.ui' applies.
#
# Created: Wed Sep 18 14:29:28 2019
#      by: pyside2-uic  running on PySide2 5.13.0
#
# WARNING! All changes made in this file will be lost!

from PySide2 import QtCore, QtGui, QtWidgets

class Ui_lvjing(object):
    def setupUi(self, lvjing):
        lvjing.setObjectName("lvjing")
        lvjing.resize(559, 323)
        self.centralwidget = QtWidgets.QWidget(lvjing)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.splitter = QtWidgets.QSplitter(self.centralwidget)
        self.splitter.setOrientation(QtCore.Qt.Horizontal)
        self.splitter.setObjectName("splitter")
        self.pbtn_file = QtWidgets.QPushButton(self.splitter)
        font = QtGui.QFont()
        font.setPointSize(20)
        self.pbtn_file.setFont(font)
        self.pbtn_file.setObjectName("pbtn_file")
        self.cd_filter_list = QtWidgets.QComboBox(self.splitter)
        self.cd_filter_list.setMinimumSize(QtCore.QSize(250, 0))
        self.cd_filter_list.setMaximumSize(QtCore.QSize(16777215, 50))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.cd_filter_list.setFont(font)
        self.cd_filter_list.setObjectName("cd_filter_list")
        self.cd_filter_list.addItem("")
        self.cd_filter_list.addItem("")
        self.cd_filter_list.addItem("")
        self.cd_filter_list.addItem("")
        self.cd_filter_list.addItem("")
        self.cd_filter_list.addItem("")
        self.pbtn_process = QtWidgets.QPushButton(self.splitter)
        font = QtGui.QFont()
        font.setPointSize(20)
        self.pbtn_process.setFont(font)
        self.pbtn_process.setObjectName("pbtn_process")
        self.verticalLayout.addWidget(self.splitter)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.lb_input_img = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setPointSize(20)
        self.lb_input_img.setFont(font)
        self.lb_input_img.setAlignment(QtCore.Qt.AlignCenter)
        self.lb_input_img.setObjectName("lb_input_img")
        self.horizontalLayout.addWidget(self.lb_input_img)
        self.lb_output_img = QtWidgets.QLabel(self.centralwidget)
        self.lb_output_img.setMinimumSize(QtCore.QSize(250, 0))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.lb_output_img.setFont(font)
        self.lb_output_img.setAlignment(QtCore.Qt.AlignJustify|QtCore.Qt.AlignVCenter)
        self.lb_output_img.setObjectName("lb_output_img")
        self.horizontalLayout.addWidget(self.lb_output_img)
        self.verticalLayout.addLayout(self.horizontalLayout)
        lvjing.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(lvjing)
        self.statusbar.setObjectName("statusbar")
        lvjing.setStatusBar(self.statusbar)

        self.retranslateUi(lvjing)
        QtCore.QMetaObject.connectSlotsByName(lvjing)

    def retranslateUi(self, lvjing):
        lvjing.setWindowTitle(QtWidgets.QApplication.translate("lvjing", "滤镜处理", None, -1))
        self.pbtn_file.setText(QtWidgets.QApplication.translate("lvjing", "选择图片文件", None, -1))
        self.cd_filter_list.setItemText(0, QtWidgets.QApplication.translate("lvjing", "彩色滤镜", None, -1))
        self.cd_filter_list.setItemText(1, QtWidgets.QApplication.translate("lvjing", "黑白滤镜", None, -1))
        self.cd_filter_list.setItemText(2, QtWidgets.QApplication.translate("lvjing", "模糊滤镜", None, -1))
        self.cd_filter_list.setItemText(3, QtWidgets.QApplication.translate("lvjing", "素描滤镜", None, -1))
        self.cd_filter_list.setItemText(4, QtWidgets.QApplication.translate("lvjing", "浮雕滤镜", None, -1))
        self.cd_filter_list.setItemText(5, QtWidgets.QApplication.translate("lvjing", "表情包", None, -1))
        self.pbtn_process.setText(QtWidgets.QApplication.translate("lvjing", "开始处理", None, -1))
        self.lb_input_img.setText(QtWidgets.QApplication.translate("lvjing", "处理前", None, -1))
        self.lb_output_img.setText(QtWidgets.QApplication.translate("lvjing", "              处理后", None, -1))

4.最后编写处理代码即可实现最后效果

import  sys
import cv2
import numpy as np
from PySide2.QtWidgets import *
from PySide2.QtGui import *
from ui_lvjing import Ui_lvjing
from PIL import Image,ImageFilter,ImageQt,ImageDraw,ImageFont

class ProcessImg(QMainWindow, Ui_lvjing):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        #图片文件路径
        self.file = None
        self.pbtn_file.clicked.connect(self.select_file)
        self.pbtn_process.clicked.connect(self.process_img)
        self.lb_input_img.setScaledContents(True)
        self.lb_output_img.setScaledContents(True)
        self.show()
    
    def select_file(self):
        file_path = QFileDialog.getOpenFileName(caption="选择文件",filter = "(*.jpg *.png)")
        if file_path[0]:
            self.file = file_path[0]
            img_pix = QPixmap(self.file)
            self.lb_input_img.setPixmap(img_pix)
        else:
            QMessageBox.warning(self, "注意", "请先选择文件")

    def process_img(self):
        if self.file:
            #打开图片
            img = Image.open(self.file)
            
            #获取列表选择控的当前内容
            text = self.cd_filter_list.currentText()
    
            if text=="模糊滤镜":
                img_temp = img.filter(ImageFilter.BLUR).convert("RGBA")
                img_qt = ImageQt.ImageQt(img_temp)
                img_pix = QPixmap.fromImage(img_qt)
                self.lb_output_img.setPixmap(img_pix)
            if text == "素描滤镜":
                img_temp = img.filter(ImageFilter.CONTOUR).convert("RGBA")
                img_qt = ImageQt.ImageQt(img_temp)
                img_pix = QPixmap.fromImage(img_qt)
                self.lb_output_img.setPixmap(img_pix)
            if text == "浮雕滤镜":
                img_temp = img.filter(ImageFilter.EMBOSS).convert("RGBA")
                img_qt = ImageQt.ImageQt(img_temp)
                img_pix = QPixmap.fromImage(img_qt)
                self.lb_output_img.setPixmap(img_pix)

            if text=="黑白滤镜":  # 读取图片
                img_temp = img.convert("L").convert("RGBA")
                img_qt = ImageQt.ImageQt(img_temp)
                img_pix = QPixmap.fromImage(img_qt)
                self.lb_output_img.setPixmap(img_pix)  # 转化为黑白图片
            
            if text =="彩色滤镜":
                r, g, b = img.split()
                img= Image.merge('RGB', (b, g, r))
                img_temp = img.convert("RGBA")
                img_qt = ImageQt.ImageQt(img_temp)
                img_pix = QPixmap.fromImage(img_qt)
                self.lb_output_img.setPixmap(img_pix)

            if text=="表情包":
                font_set = ImageFont.truetype("msyh.ttc", 40)
                draw = ImageDraw.Draw(img)
                draw.text((80, 350), "你是编程猫的未来", fill=(0, 0, 0), font=font_set)
                img_temp = img.convert("RGBA")
                img_qt = ImageQt.ImageQt(img_temp)
                img_pix = QPixmap.fromImage(img_qt)
                self.lb_output_img.setPixmap(img_pix)


                

        #滤镜处理

        else:
            QMessageBox.warning(self,"注意","请先选择文件")

if __name__=="__main__":
    app = QApplication(sys.argv)
    window = ProcessImg()
    sys.exit(app.exec_())


回复

上一页1 页 / 共 1下一页
JHS天启之岛_____一首页JHS天启之岛_____一首页

看不懂

点赞0


评论


QBZ_QBZ_

我认为你界面的排版不是十分美观,可以加一些艺术元素,实在不行去找美术喵阿姨帮忙

点赞0


评论


QBZ_QBZ_

不过看得出来你是个大佬

点赞0


评论


QBZ_QBZ_

你学cv2,有接触过人脸识别哦?

点赞0


评论


星空之忆星空之忆

还可以呀

点赞0


评论