
Lv.1
以前那言论奇葩、无时不在创造黑历史的我,真的是我吗?或者…现在的我,只是过去的一片残影?
签名:摆烂(x) 努力更新小说(x) 做一只厚颜无 耻的肥鸽子,为人类解决粮食问题(✓(大雾))
在 《我的世界:模组风云》书评区 中回复
跳舞的浮雕~~~
(……太大了????)
(好吧,发不了,那发代码……)
(代码太长,不同文件分开发)
图片滤镜.py
#导入模组
from ui_process import Ui_MainWindow
from PySide2.QtWidgets import *
import sys
from PySide2.QtGui import *
from PIL import Image,ImageQt,ImageSequence,ImageFilter
from char import to_char
from sketch import to_sketch
import os
from PySide2.QtCore import *
from PySide2.QtMultimedia import *
#窗口类
class MyCharts(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.show()
self.input_l.setScaledContents(True)
#文件路径
self.file=None
#图片
self.img_temp=None
#各种滤镜!pillow库!
self.filters={
'模糊滤镜':ImageFilter.BLUR,
'轮廓滤镜': ImageFilter.CONTOUR,
'边缘增强滤镜': ImageFilter.EDGE_ENHANCE,
'浮雕滤镜':ImageFilter.EMBOSS,
'锐化滤镜':ImageFilter.SHARPEN,
'平滑滤镜':ImageFilter.SMOOTH,
'细节增强滤镜':ImageFilter.DETAIL
}
#链接
self.input_b.clicked.connect(self.select_file)
#选择文件
def select_file(self):
file_path=QFileDialog.getOpenFileName(caption='选择文件',filter='(*.jpg *.png *.bmp *.httf *.gif)')
print(file_path)
if file_path[0]:
#图片处理
if os.path.splitext(file_path[0])[1]!='.gif':
self.file=file_path[0]
img_pix=QPixmap(self.file)
self.input_l.setPixmap(img_pix)
self.img_temp=None
self.pushButton_2.clicked.connect(self.process)
self.save_b.clicked.connect(self.save)
else:
#gif动图处理
self.file_path=file_path
#显示动图
self.gif=QMovie()
self.gif.setFileName(self.file_path[0])
self.input_l.setMovie(self.gif)
self.gif.start()
self.pushButton_2.clicked.connect(self.gif_process)
self.save_b.clicked.connect(self.save_gif)
else:
QMessageBox.warning(self,'警告','请再次选择')
#滤镜
def process(self):
if self.img_temp:
img=self.img_temp
else:
if self.file:
#打开图片和获取选择滤镜
img=Image.open(self.file).convert('RGB')
else:
QMessageBox.warning(self,'注意','请选择图片文件')
return
text=self.input_c.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)
#再次转换和显示
self.output_l.setScaledContents(True)
img_pix=QPixmap.fromImage(img_qt)
self.output_l.setPixmap(img_pix)
#保存图片
def save(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, '注意', '请重新选择保存图片的地方')
else:
QMessageBox.warning(self, '注意', '请先进行图片处理')
#gif动图处理
def gif_process(self):
from PIL import ImageSequence
#打开动图
self.img_temp=Image.open(self.file_path[0])
#分解动图
self.frames=ImageSequence.Iterator(self.img_temp)
self.duration=self.img_temp.info['extension'][1]
#处理每帧并保存
num=0
for f in self.frames:
self._gif_process_(f).save(str(num)+'.png')
print('save')
num+=1
#重新打开
self.new_frames=[]
for a in range(num):
self.new_frames.append(Image.open(str(a)+'.png'))
#保存暂时gif
self.new_frames[0].save('temp.gif', append_images=self.new_frames[1:],
save_all=True, loop=0)
#保存用的动图
self.img_temp=Image.open('temp.gif')
#显示动图
self.output_l.setScaledContents(True)
self.gif=QMovie('temp.gif')
self.output_l.setMovie(self.gif)
self.gif.start()
#打开动图
self.img_temp=Image.open('temp.gif')
#处理帧的方法
def _gif_process_(self,img):
img=img.convert('RGB')
text = self.input_c.currentText()
#判断类型
#对图像进行处理及转换
if '滤镜' in text:
img=img.filter(self.filters[text]).convert('RGBA')
elif text=='素描风格转换':
img=to_sketch(img)
elif text=='字符画风格转换':
img=to_char(img)
return img
def save_gif(self):
if self.img_temp:
file_path = QFileDialog.getSaveFileName(
caption='保存图片', filter='(*.gif)')
if file_path[0]:
#保存
save_path = file_path[0]
self.new_frames[0].save(save_path,append_images=self.new_frames[1:],save_all=True,loop=0)
else:
QMessageBox.warning(self, '注意', '请重新选择保存图片的地方')
else:
QMessageBox.warning(self, '注意', '请先进行图片处理')
#主程序
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyCharts()
sys.exit(app.exec_())
2020-09-17T19:58:51 点赞:0
在 《我的世界:模组风云》书评区 中回复
继续~~~~
ui_process.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'E:/45-图像处理软件/process.ui',
# licensing of 'E:/45-图像处理软件/process.ui' applies.
#
# Created: Fri May 29 18:38:25 2020
# by: pyside2-uic running on PySide2 5.11.2
#
# WARNING! All changes made in this file will be lost!
from PySide2 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(788, 567)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
self.layoutWidget.setGeometry(QtCore.QRect(30, 140, 701, 381))
self.layoutWidget.setObjectName("layoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.layoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.input_l = QtWidgets.QLabel(self.layoutWidget)
self.input_l.setObjectName("input_l")
self.horizontalLayout.addWidget(self.input_l)
self.output_l = QtWidgets.QLabel(self.layoutWidget)
self.output_l.setObjectName("output_l")
self.horizontalLayout.addWidget(self.output_l)
self.splitter = QtWidgets.QSplitter(self.centralwidget)
self.splitter.setGeometry(QtCore.QRect(30, 50, 701, 61))
self.splitter.setOrientation(QtCore.Qt.Horizontal)
self.splitter.setObjectName("splitter")
self.input_b = QtWidgets.QPushButton(self.splitter)
font = QtGui.QFont()
font.setWeight(75)
font.setBold(True)
self.input_b.setFont(font)
self.input_b.setObjectName("input_b")
self.input_c = QtWidgets.QComboBox(self.splitter)
font = QtGui.QFont()
font.setWeight(75)
font.setBold(True)
self.input_c.setFont(font)
self.input_c.setObjectName("input_c")
self.input_c.addItem("")
self.input_c.addItem("")
self.input_c.addItem("")
self.input_c.addItem("")
self.input_c.addItem("")
self.input_c.addItem("")
self.input_c.addItem('')
self.input_c.addItem('')
self.input_c.addItem('')
self.pushButton_2 = QtWidgets.QPushButton(self.splitter)
self.pushButton_2.setObjectName("pushButton_2")
MainWindow.setCentralWidget(self.centralwidget)
self.save_b=QtWidgets.QPushButton(self)
self.save_b.setGeometry(QtCore.QRect(0,500,800,501))
self.save_b.show()
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtWidgets.QApplication.translate(
"MainWindow", "MainWindow", None, -1))
self.input_l.setText(
QtWidgets.QApplication.translate("MainWindow", "处理前", None, -1))
self.output_l.setText(
QtWidgets.QApplication.translate("MainWindow", "处理后", None, -1))
self.input_b.setText(QtWidgets.QApplication.translate(
"MainWindow", "选择图片文件", None, -1))
self.input_c.setItemText(
0, QtWidgets.QApplication.translate("MainWindow", "模糊滤镜", None, -1))
self.input_c.setItemText(
1, QtWidgets.QApplication.translate("MainWindow", "轮廓滤镜", None, -1))
self.input_c.setItemText(
2, QtWidgets.QApplication.translate("MainWindow", "边缘增强滤镜", None, -1))
self.input_c.setItemText(
3, QtWidgets.QApplication.translate("MainWindow", "浮雕滤镜", None, -1))
self.input_c.setItemText(
4, QtWidgets.QApplication.translate("MainWindow", "锐化滤镜", None, -1))
self.input_c.setItemText(
5, QtWidgets.QApplication.translate("MainWindow", "平滑滤镜", None, -1))
self.input_c.setItemText(
6, QtWidgets.QApplication.translate("MainWindow", "细节增强滤镜", None, -1))
self.input_c.setItemText(
7, QtWidgets.QApplication.translate("MainWindow", "素描风格转换", None, -1))
self.input_c.setItemText(
8, QtWidgets.QApplication.translate("MainWindow", "字符画风格转换", None, -1))
self.pushButton_2.setText(
QtWidgets.QApplication.translate("MainWindow", "开始处理", None, -1))
self.save_b.setText(
QtWidgets.QApplication.translate("MainWindow", '保存结果', None, -1))
2020-09-17T19:59:35 点赞:0
在 《我的世界:模组风云》书评区 中回复
接着上面~~~
char.py
from PIL import Image, ImageDraw
def to_char(img):
#图片宽高
width, height = (60, 60)
#灰度图
img = img.convert("L").resize((width, height))
ASCII_HIGH = '''$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. '''
txt = ''
for y in range(height):
for x in range(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")
2020-09-17T20:00:14 点赞:0
在 《我的世界:模组风云》书评区 中回复
终于要发完了……
sketch.py
from PIL import Image, ImageOps, ImageFilter
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 in range(width):
for y in range(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
2020-09-17T20:02:21 点赞:0
在 《我的世界:模组风云》书评区 中回复
天啊,今天尽然要画一幅“模仿梵高风格”的画????
今天肯定又是不能写小说的一天…(不过我还是会尝试写200字)
2020-09-18T19:53:23 点赞:0
在 《我的世界:模组风云》书评区 中回复
天啊…我也太能扯了…S喵-HJ-004档案本来就200字…
在喜马拉雅上被我强行说了3分30秒 …
(欢迎大家去喜马拉雅搜索“S喵-HJ”)(广告来的措不及防啊~
2020-09-19T14:11:30 点赞:0
在 《我的世界:模组风云》书评区 中回复
实验:Pillow各滤镜&编程猫教的效果的运行时间
(此实验数据来自一很小de gif动图,利用下方我的图片+gif动图处理软件进行实验,时间来自time.perf_counter())
模糊滤镜:0.10801659999999999
轮廓滤镜:0.10338539999999963
边缘增强滤镜:0.08784930000000202
浮雕滤镜:0.08441189999999921
锐化滤镜:0.08677499999999938
平滑滤镜:0.08271700000000237
细节增强滤镜:0.0832782000000023
素描效果:2.7496745000000047
字符画效果:0.6062291000000002
……做个大约的排行榜吧……
1.素描效果
2.字符画效果
3.模糊滤镜+轮廓滤镜
4.其他滤镜
(图片会更快)
(其他一般的动图素描效果和字符画效果超级慢!!!!!!素描效果甚至要等1分钟………………………………………………)
2020-09-19T16:51:16 点赞:0
在 《我的世界:模组风云》书评区 中回复
祝大家中秋国庆快乐~~~
🥮🥮🥮🥮🥮🥮🥮🥮🥮🥮🥮🥮
🥮🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🥮
🥮🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🥮
🥮🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🥮
🥮🥮🥮🥮🥮🥮🥮🥮🥮🥮🥮🥮
2020-10-01T06:22:53 点赞:0