用户:机灵的飓风雀UysC查看:72 回复:0 评论:0 创建时间:2022-05-06T19:28:40
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'C:/Users/codemao/Desktop/pyecharts/46/wo/process_img.ui', # licensing of 'C:/Users/codemao/Desktop/pyecharts/46/wo/process_img.ui' applies. # # Created: Tue Sep 10 17:39:33 2019 # by: pyside2-uic running on PySide2 5.13.0 # # WARNING! All changes made in this file will be lost!
from PIL import Image, ImageDraw from PIL import Image, ImageOps, ImageFilter from PIL import Image, ImageFilter, ImageQt import sys from ui_process_img import Ui_process_img from char import to_char from sketch import to_sketch from PySide2.QtGui import * from PySide2.QtWidgets import* from PySide2 import QtCore, QtGui, QtWidgets
class Ui_process_img(object): def setupUi(self, process_img): process_img.setObjectName("process_img") process_img.resize(927, 426) self.centralwidget = QtWidgets.QWidget(process_img) 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) self.pbtn_file.setObjectName("pbtn_file") self.cb_filter_list = QtWidgets.QComboBox(self.splitter) self.cb_filter_list.setMinimumSize(QtCore.QSize(300, 0)) self.cb_filter_list.setMaximumSize(QtCore.QSize(16777215, 50)) self.cb_filter_list.setObjectName("cb_filter_list") 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.pbtn_process = QtWidgets.QPushButton(self.splitter) self.pbtn_process.setObjectName("pbtn_process") self.verticalLayout.addWidget(self.splitter) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.lb_input_img = QtWidgets.QLabel(self.centralwidget) self.lb_input_img.setMinimumSize(QtCore.QSize(300, 0)) font = QtGui.QFont() font.setPointSize(30) self.lb_input_img.setFont(font) self.lb_input_img.setAlignment(QtCore.Qt.AlignCenter) self.lb_input_img.setObjectName("lb_input_img") self.horizontalLayout_2.addWidget(self.lb_input_img) self.lb_output_img = QtWidgets.QLabel(self.centralwidget) font = QtGui.QFont() font.setPointSize(30) self.lb_output_img.setFont(font) self.lb_output_img.setAlignment(QtCore.Qt.AlignCenter) self.lb_output_img.setObjectName("lb_output_img") self.horizontalLayout_2.addWidget(self.lb_output_img) self.verticalLayout.addLayout(self.horizontalLayout_2) self.pbtn_save_img = QtWidgets.QPushButton(self.centralwidget) self.pbtn_save_img.setObjectName("pbtn_save_img") self.verticalLayout.addWidget(self.pbtn_save_img) process_img.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(process_img) self.statusbar.setObjectName("statusbar") process_img.setStatusBar(self.statusbar)
self.retranslateUi(process_img) QtCore.QMetaObject.connectSlotsByName(process_img)
def retranslateUi(self, process_img): process_img.setWindowTitle( QtWidgets.QApplication.translate("process_img", "图像处理", None, -1)) self.pbtn_file.setText(QtWidgets.QApplication.translate( "process_img","选择图片文件",None,-1)) self.cb_filter_list.setItemText( 0, QtWidgets.QApplication.translate("process_img","模糊滤镜",None,-1)) self.cb_filter_list.setItemText( 1, QtWidgets.QApplication.translate("process_img","轮廓滤镜",None,-1)) self.cb_filter_list.setItemText( 2, QtWidgets.QApplication.translate("process_img","边缘增强滤镜",None,-1)) self.cb_filter_list.setItemText( 3, QtWidgets.QApplication.translate("process_img","浮雕滤镜",None,-1)) self.cb_filter_list.setItemText( 4, QtWidgets.QApplication.translate("process_img","锐化滤镜",None,-1)) self.cb_filter_list.setItemText( 5, QtWidgets.QApplication.translate("process_img","平滑滤镜",None,-1)) self.cb_filter_list.setItemText( 6, QtWidgets.QApplication.translate("process_img","素描风格转化",None,-1)) self.cb_filter_list.setItemText( 7, QtWidgets.QApplication.translate("process_img","字符画风格转化",None,-1)) self.pbtn_process.setText(QtWidgets.QApplication.translate( "process_img","开始处理",None,-1)) self.lb_input_img.setText( QtWidgets.QApplication.translate("process_img", "处理前", None, -1)) self.lb_output_img.setText( QtWidgets.QApplication.translate("process_img", "处理后", None, -1)) self.pbtn_save_img.setText(QtWidgets.QApplication.translate( "process_img","保存处理结果",None,-1))
class ProcessImg(QMainWindow, Ui_process_img): def__init__(self): super().__init__() self.setupUi(self)
self.file = None self.img_temp = None self.filters = { "模糊滤镜": ImageFilter.BLUR, "轮廓滤镜": ImageFilter.CONTOUR, "边缘增强滤镜": ImageFilter.EDGE_ENHANCE, "浮雕滤镜": ImageFilter.EMBOSS, "锐化滤镜": ImageFilter.SHARPEN, "平滑滤镜": ImageFilter.SMOOTH,
}
self.pbtn_file.clicked.connect(self.select_file) self.pbtn_process.clicked.connect(self.process_img) self.pbtn_save_img.clicked.connect(self.save_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: print("重新选择图片文件")
def process_img(self): if self.file: img = Image.open(self.file) text = self.cb_filter_list.currentText() if"滤镜"in text: self.img_temp = img.filter(self.filters[text]).convert("RGBA") elif text == "素描风格转化": self.img_temp = to_sketch(img) elif text == "字符画风格转化": self.img_temp = to_char(img) img_qt = ImageQt.ImageQt(self.img_temp) img_pix = QPixmap.fromImage(img_qt) self.lb_output_img.setPixmap(img_pix) else: QMessageBox.warning(self, "warning!", "Choose it first")
def save_img(self): if self.img_temp: file_path = QFileDialog.getSaveFileName( caption="保存文件", filter="(*.png)") if file_path[0]: save_path = file_path[0] self.img_temp.save(save_path) else: QMessageBox.warning(self, "warning", "choose it again") else: QMessageBox.warning(self, "warning", "please choose it first")
if __name__ == '__main__': app = QApplication(sys.argv) window = ProcessImg() sys.exit(app.exec_())
def to_sketch(img): width, height = img.size #转灰度图 img_gray = img.convert("L") #反色 img_invert = ImageOps.invert(img_gray) #高斯模糊 img_gaussian = img_invert.filter(ImageFilter.GaussianBlur(5)) #颜色减淡 for x inrange(width): for y inrange(height): pos = (x, y) A = img_gray.getpixel(pos) B = img_gaussian.getpixel(pos) img_gray.putpixel(pos, min(int(A+A*B/(255-B)), 255)) return img_gray
if __name__ == "__main__": img = Image.open("bcm.jpg") to_sketch(img).save("bcm_sketch.jpg")
def to_char(img): #图片宽高 width, height = (60, 60) #灰度图 img = img.convert("L").resize((width, height)) #plt.imshow(img) #plt.show()
ASCII_HIGH = '''$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. '''
txt = '' for y inrange(height): for x inrange(width): pos = (x, y) gray = img.getpixel(pos) index = int(gray/256*70) txt += ASCII_HIGH[index]+' ' txt += '\n' img_new = Image.new("RGB", (width*12, height*15), "white") # 生成空白图片 draw = ImageDraw.Draw(img_new) # 图片转画布 draw.text((0, 0), txt, fill="black") # 文字写入 return img_new.resize((width*12, height*12)).convert("RGBA")
if __name__ == '__main__': img = Image.open("bcm.jpg") to_char(img).save("bcm_char.png")