简介
Python有着强大的功能,其中Numpy库可以以点的方式画图,还有一种妙用就是改变图片
该程序主要代码来源于MOOC,想学习完整过程戳这里>>MOOC嵩天
我跟着视频敲了这个程序的主要代码(使用的pycharm),然后添加了一些内容打包了一个.exe文件,需要的话自行下载
库缺少请自行搜索下载
上代码
# -*- coding: utf-8 -*-
"""
Created on Wed Apr 24 13:07:31 2019
@author: 隰有游龙
"""
from PIL import Image
from numpy import asarray,gradient,pi,sin,cos,sqrt
from tkinter.filedialog import askopenfilename, asksaveasfilename
from tkinter.messagebox import showinfo, showerror
from os import path
from tkinter import Tk
root = Tk()
root.withdraw()
default_dir = r"文件路径"
file_path = askopenfilename(title=u'选择文件', initialdir=(path.expanduser(default_dir)))
if file_path:
try:
last = path.splitext(file_path)[-1]
Last = last[1:].upper()
#来源MOOC嵩天
a = asarray(Image.open(file_path).convert('L')).astype('float')
depth = 10. # (0-100)
grad = gradient(a) #取图像灰度的梯度值
grad_x, grad_y = grad #分别取横纵图像梯度值
grad_x = grad_x*depth/100.
grad_y = grad_y*depth/100.
A = sqrt(grad_x**2 + grad_y**2 + 1.)
uni_x = grad_x/A
uni_y = grad_y/A
uni_z = 1./A
vec_el = pi/2.2 # 光源的俯视角度,弧度值
vec_az = pi/4. # 光源的方位角度,弧度值
dx = cos(vec_el)*cos(vec_az) #光源对x 轴的影响
dy = cos(vec_el)*sin(vec_az) #光源对y 轴的影响
dz = sin(vec_el) #光源对z 轴的影响
b = 255*(dx*uni_x + dy*uni_y + dz*uni_z) #光源归一化
b = b.clip(0,255)
im = Image.fromarray(b.astype('uint8')) #重构图像
showinfo('提示','修改完成!')
fname = asksaveasfilename(title=u'保存文件', filetypes=[(Last,last)])
im.save(str(fname) + last)
except:
showerror('错误','无法修改所选文件!')
上效果图(网上随便找的图)
一次变化效果最好,多次会重影(感觉建筑效果比较好)
至于这个打包文件这么大我也不知道该这么办(求大佬指教)
但是用来装个***还是很好用的(记得提前看效果,失败概不负责)