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

【作品介绍】
根据提示安装库就可以运行了
【作品源代码】
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