猫史档案馆


【Python作品分享】图像滤镜转换【作品秀】

用户:申浩南申浩南查看:4 回复:2 评论:4 创建时间:2021-09-05T12:40:25


【作品展示】

center_image

 

【作品介绍】

根据提示安装库就可以运行了

 

【作品源代码】

from PySide2.QtCore import *
import sys
import os
from PIL import Image, ImageOps, ImageFilter, ImageDraw
from PySide2.QtWidgets import *
from PySide2.QtGui import *


def to_chart(img):
    w, h = (60, 60)

    img = img.convert('L').resize((w, h))

    ASCII_HIGH = '''$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. '''

    txt = ''
    for y in range(h):
        for x in range(w):
            pos = (x, y)
            gray = img.getpixel(pos)
            index = int(gray/256*70)
            txt += ASCII_HIGH[index]+' '
        txt += '\n'

    with open('bcm.txt', 'w', encoding='utf-8') as f:
        f.write(txt)
    image = Image.new('RGB', (w*12, h*喵))
    draw = ImageDraw.Draw(image)
    draw.text((0, 0), txt, fill=(0, 0, 0))

    return image


def to_sketch(img):
    w, h = img.size
    img_gray = img.convert('L')
    img_gray_fan = ImageOps.invert(img_gray)
    img_gray_fan_gs = img_gray_fan.filter(ImageFilter.GaussianBlur(5))

    for x in range(w):
        for y in range(h):
            pos = (x, y)

            A = img_gray.getpixel(pos)
            B = img_gray_fan_gs.getpixel(pos)
            img_gray.putpixel(pos, min(int(A+A*B/(255-B)), 255))
    return img_gray


try:
    os.system('del '+'C:'+os.sep + 'img_filter_python_temp' +
              os.sep+'process_temp.png')
except:
    pass

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(1280, 800)
        font = QFont()
        font.setFamily(u"\u7b49\u7ebf Light")
        font.setItalic(False)
        MainWindow.setFont(font)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.label = QLabel(self.centralwidget)
        self.label.setObjectName(u"label")
        self.label.setGeometry(QRect(60, -20, 1200, 300))
        self.label.setMinimumSize(QSize(1200, 100))
        self.label.setMaximumSize(QSize(100000, 16777215))
        font1 = QFont()
        font1.setFamily(u"\u6977\u4f53")
        font1.setPointSize(55)
        font1.setBold(True)
        font1.setWeight(75)
        font1.setStyleStrategy(QFont.PreferDefault)
        self.label.setFont(font1)
        self.label.setCursor(QCursor(Qt.IBeamCursor))
        self.label.setFocusPolicy(Qt.NoFocus)
        self.label.setLayoutDirection(Qt.RightToLeft)
        self.label.setAutoFillBackground(False)
        self.label.setTextFormat(Qt.AutoText)
        self.layoutWidget = QWidget(self.centralwidget)
        self.layoutWidget.setObjectName(u"layoutWidget")
        self.layoutWidget.setGeometry(QRect(370, 240, 891, 461))
        self.horizontalLayout = QHBoxLayout(self.layoutWidget)
        self.horizontalLayout.setObjectName(u"horizontalLayout")
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.lb_input_img = QLabel(self.layoutWidget)
        self.lb_input_img.setObjectName(u"lb_input_img")
        self.lb_input_img.setBaseSize(QSize(0, 0))
        font2 = QFont()
        font2.setFamily(u"\u6977\u4f53")
        font2.setPointSize(20)
        font2.setBold(True)
        font2.setWeight(75)
        self.lb_input_img.setFont(font2)
        self.lb_input_img.setCursor(QCursor(Qt.IBeamCursor))

        self.horizontalLayout.addWidget(self.lb_input_img)

        self.lb_output_img = QLabel(self.layoutWidget)
        self.lb_output_img.setObjectName(u"lb_output_img")
        font3 = QFont()
        font3.setFamily(u"\u6977\u4f53")
        font3.setPointSize(20)
        font3.setBold(True)
        font3.setWeight(75)
        font3.setStyleStrategy(QFont.PreferDefault)
        self.lb_output_img.setFont(font3)
        self.lb_output_img.setCursor(QCursor(Qt.IBeamCursor))

        self.horizontalLayout.addWidget(self.lb_output_img)

        self.splitter = QSplitter(self.centralwidget)
        self.splitter.setObjectName(u"splitter")
        self.splitter.setGeometry(QRect(20, 240, 341, 461))
        self.splitter.setMinimumSize(QSize(300, 200))
        self.splitter.setMaximumSize(QSize(16777215, 16777215))
        font4 = QFont()
        font4.setPointSize(18)
        self.splitter.setFont(font4)
        self.splitter.setOrientation(Qt.Vertical)
        self.pbtn_file = QPushButton(self.splitter)
        self.pbtn_file.setObjectName(u"pbtn_file")
        self.pbtn_file.setMinimumSize(QSize(300, 50))
        self.pbtn_file.setMaximumSize(QSize(16777215, 16777215))
        self.pbtn_file.setSizeIncrement(QSize(50, 0))
        font5 = QFont()
        font5.setFamily(u"\u6977\u4f53")
        font5.setPointSize(30)
        font5.setBold(True)
        font5.setWeight(75)
        self.pbtn_file.setFont(font5)
        self.pbtn_file.setCursor(QCursor(Qt.PointingHandCursor))
        self.splitter.addWidget(self.pbtn_file)
        self.cb_filter_list = QComboBox(self.splitter)
        self.cb_filter_list.addItem("")
        self.cb_filter_list.addItem("")
        self.cb_filter_list.addItem("")
        self.cb_filter_list.addItem("")
        self.cb_filter_list.addItem("")
        self.cb_filter_list.addItem("")
        self.cb_filter_list.addItem("")
        self.cb_filter_list.addItem("")
        self.cb_filter_list.setObjectName(u"cb_filter_list")
        font6 = QFont()
        font6.setFamily(u"\u6977\u4f53")
        font6.setPointSize(30)
        font6.setBold(True)
        font6.setWeight(75)
        font6.setKerning(True)
        self.cb_filter_list.setFont(font6)
        self.cb_filter_list.setCursor(QCursor(Qt.PointingHandCursor))
        self.cb_filter_list.setLayoutDirection(Qt.LeftToRight)
        self.cb_filter_list.setAutoFillBackground(False)
        self.splitter.addWidget(self.cb_filter_list)
        self.pbtn_process = QPushButton(self.splitter)
        self.pbtn_process.setObjectName(u"pbtn_process")
        self.pbtn_process.setFont(font5)
        self.pbtn_process.setCursor(QCursor(Qt.PointingHandCursor))
        self.splitter.addWidget(self.pbtn_process)
        self.pushButton = QPushButton(self.centralwidget)
        self.pushButton.setObjectName(u"pushButton")
        self.pushButton.setGeometry(QRect(40, 710, 721, 51))
        font7 = QFont()
        font7.setPointSize(20)
        font7.setBold(True)
        font7.setItalic(True)
        font7.setWeight(75)
        font7.setStrikeOut(False)
        font7.setKerning(True)
        font7.setStyleStrategy(QFont.PreferDefault)
        self.pushButton.setFont(font7)
        self.pushButton.setCursor(QCursor(Qt.PointingHandCursor))
        self.pushButton.setMouseTracking(False)
        self.pushButton.setFocusPolicy(Qt.StrongFocus)
        self.pbtn_diejia = QPushButton(self.centralwidget)
        self.pbtn_diejia.setObjectName(u"pbtn_diejia")
        self.pbtn_diejia.setGeometry(QRect(770, 710, 491, 51))
        font8 = QFont()
        font8.setPointSize(12)
        font8.setBold(True)
        font8.setItalic(True)
        font8.setWeight(75)
        self.pbtn_diejia.setFont(font8)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName(u"statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)

        QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate(
            "MainWindow", u"\u56fe\u50cf\u6ee4\u955c\u5904\u7406\u5668", None))
        self.label.setText(QCoreApplication.translate(
            "MainWindow", u"\u56fe \u50cf \u6ee4 \u955c \u5904 \u7406 \u5668", None))
        self.lb_input_img.setText(QCoreApplication.translate(
            "MainWindow", u"\u539f\u56fe", None))
        self.lb_output_img.setText(QCoreApplication.translate(
            "MainWindow", u"\u6ee4\u955c", None))
        self.pbtn_file.setText(QCoreApplication.translate(
            "MainWindow", u"\u9009\u62e9\u56fe\u7247\u6587\u4ef6", None))
        self.cb_filter_list.setItemText(
            0, QCoreApplication.translate("MainWindow", u"\u6a21\u7cca", None))
        self.cb_filter_list.setItemText(
            1, QCoreApplication.translate("MainWindow", u"\u9510\u5316", None))
        self.cb_filter_list.setItemText(
            2, QCoreApplication.translate("MainWindow", u"\u6d6e\u96d5", None))
        self.cb_filter_list.setItemText(
            3, QCoreApplication.translate("MainWindow", u"\u5e73\u6ed1", None))
        self.cb_filter_list.setItemText(
            4, QCoreApplication.translate("MainWindow", u"\u8f6e\u5ed3", None))
        self.cb_filter_list.setItemText(5, QCoreApplication.translate(
            "MainWindow", u"\u8fb9\u7f18\u589e\u5f3a", None))
        self.cb_filter_list.setItemText(6, QCoreApplication.translate(
            "MainWindow", u"\u5b57\u7b26\u753b\u98ce\u683c", None))
        self.cb_filter_list.setItemText(7, QCoreApplication.translate(
            "MainWindow", u"\u7d20\u63cf\u98ce\u683c", None))

        self.pbtn_process.setText(QCoreApplication.translate(
            "MainWindow", u"\u5f00\u59cb\u5904\u7406", None))
        self.pushButton.setText(QCoreApplication.translate(
            "MainWindow", u"\u5b58\u50a8", None))
        self.pbtn_diejia.setText(QCoreApplication.translate(
            "MainWindow", u"\u53e0\u52a0\u5904\u7406\u9884\u5907\uff08\u5c06\u5904\u7406\u540e\u7684\u56fe\u50cf\u8f6c\u6362\u4e3a\u539f\u56fe\uff09", None))



class ProcessImg(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.file = None
        self.img_temp = None
        self.isdiejia = False
        self.filters = {
            '模糊': ImageFilter.BLUR,
            '轮廓': ImageFilter.CONTOUR,
            '边缘增强': ImageFilter.EDGE_ENHANCE,
            '浮雕': ImageFilter.EMBOSS,
            '锐化': ImageFilter.SHARPEN,
            '平滑': ImageFilter.SMOOTH,
        }
        self.pbtn_file.clicked.connect(self.select_file)
        self.pushButton.clicked.connect(self.save_file)
        self.pbtn_process.clicked.connect(self.process_img)
        self.pbtn_diejia.clicked.connect(self.diejia)
        self.lb_input_img.setScaledContents(True)
        self.lb_output_img.setScaledContents(True)
        self.show()

    def select_file(self):
        self.isdiejia = False
        file_path = QFileDialog.getOpenFileName(
            caption='选择文件', filter='图像文件(*.jpg *.jpeg *.png *.bmp *.ico *.dib *.gif)')
        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 save_file(self):
        if self.file:
            file_path = QFileDialog.getSaveFileName(
                caption='选择文件', filter='图像文件(*.jpg *.jpeg *.png *.bmp *.ico *.dib *.gif)')
            if file_path[0]:
                self.file = file_path[0]
                self.img_temp.save(self.file)
                QMessageBox.information(self, '提示', '保存成功\n路径:'+self.file)
            else:
                QMessageBox.warning(self, '错误', '选择文件存储路径失败')
        else:
            QMessageBox.warning(self, '错误', '请先进行图像处理')

    def process_img(self):
        if self.file:
            img = Image.open(self.file)
            if self.isdiejia:
                img = self.img_temp
            text = self.cb_filter_list.currentText()
            if not (text == '素描风格' or text == '字符画风格'):
                self.img_temp = img.filter(self.filters[text]).convert('RGBA')
            elif text == '素描风格':
                if not self.isdiejia:
                    self.img_temp = to_sketch(Image.open(self.file))
                else:
                    self.img_temp = to_sketch(self.img_temp)
            elif text == '字符画风格':
                if not self.isdiejia:
                    self.img_temp = to_chart(Image.open(self.file))
                else:
                    self.img_temp = to_chart(self.img_temp)

            try:
                os.mkdir('C:'+os.sep+'img_filter_python_temp')
            except:
                pass
            self.img_temp.save(
                'C:'+os.sep+'img_filter_python_temp'+os.sep+'process_temp.png')
            img_pix = QPixmap(
                'C:'+os.sep+'img_filter_python_temp'+os.sep+'process_temp.png')
            self.lb_output_img.setPixmap(img_pix)
        else:
            QMessageBox.warning(self, '注意', '请先选择图片文件')

    def diejia(self):
        self.isdiejia = True
        try:
            open('C:'+os.sep+'img_filter_python_temp'+os.sep+'process_temp.png')
        except:
            QMessageBox.warning(self, '错误', '暂无已处理的图像...')
        self.lb_input_img.setPixmap(
            'C:'+os.sep+'img_filter_python_temp'+os.sep+'process_temp.png')
        self.img_temp = Image.open(
            'C:'+os.sep+'img_filter_python_temp'+os.sep+'process_temp.png')


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

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
Python-happyyyyPython-happyyyy

靠,怎么又抄

点赞0


评论


伴雪纷飞伴雪纷飞

又来作业贴

点赞1


评论