################################################################################
### Copyright Version 1.00 by xiaozhanfeng, Last modify at 2020-01-13
### 本程序将图片转换为圆形、菱形、五边形、六边形、八边形的png文件,推送邮件
### 需转换的文件从convertimage.cfg读取
################################################################################### 程序初始化
#coding=utf-8
import os,math,time                                                             # 系统,计算,时间库
from PIL import Image                                                           # 图形库
import smtplib as sb                                                            # 邮件库
from email.mime.text import MIMEText                                            # 邮件库
from email.header import Header                                                 # 邮件库INTLISTcnttime=[0,0,0,0,0]                                                      # 功能运行耗时################################################################################
### 处理一批图形文件
################################################################################
def FUNCconvertimage(STRLISTfilenamein,STRfilenameoutflag):INTbegintime=time.perf_counter()for STRfilenameintmp in STRLISTfilenamein:STRfilenamein=STRfilenameintmp.split()STRfilenamein=STRfilenamein[0]INTcnttime=FUNCconvert(STRfilenamein,STRfilenameoutflag)INTcnttime=round(time.perf_counter()-INTbegintime)        return INTcnttime################################################################################
### 处理一个图形文件
################################################################################
def FUNCconvert(STRfilenamein,STRfilenameoutflag):INTbegintime=time.perf_counter()if os.path.exists(STRfilenamein):                                           # 输入图片不存在,直接返回FILEIMGhandlein=Image.open(STRfilenamein).convert("RGBA")               # 读入输入图片INTLISTsizeorg=FILEIMGhandlein.size                                     # 输入图片原始尺寸,高,宽INTlengthuse=min(INTLISTsizeorg[0],INTLISTsizeorg[1])                   # 剪裁后的图片尺寸,高,宽,正方形if INTLISTsizeorg[0] != INTLISTsizeorg[1]:                              # 输入图片剪裁为正方形FILEIMGhandlein.resize((INTlengthuse,INTlengthuse),Image.ANTIALIAS)FLOATtan18=math.tan(math.radians(18))                                   # 18度的正切值FLOATtan30=math.tan(math.radians(30))                                   # 30度的正切值FLOATtan36=math.tan(math.radians(36))                                   # 36度的正切值FLOATtan45=math.tan(math.radians(45))                                   # 45度的正切值FLOATsin45=math.sin(math.radians(45))                                   # 45度的正弦值FLOAT921=float(INTlengthuse/2)                                          # 1/2位置FLOAT5x1=float((INTlengthuse-INTlengthuse/2*FLOATtan36)*FLOATtan18)     # 五边形x轴位置1,正五边形内角108度FLOAT5x2=float(INTlengthuse-FLOAT5x1)                                   # 五边形x轴位置2,正五边形内角108度FLOAT5y1=float(INTlengthuse/2*FLOATtan36)                               # 五边形y轴位置,正五边形内角108度FLOAT6x1=float(INTlengthuse/2*FLOATtan30)                               # 六边形x轴位置1,正六边形内角120度FLOAT6x2=float(INTlengthuse-FLOAT6x1)                                   # 六边形x轴位置2,正六边形内角120度FLOAT8x1=float(INTlengthuse*FLOATsin45/(1+2*FLOATsin45))                # 八边形x轴位置1,正八边形内角135度FLOAT8x2=float(INTlengthuse-FLOAT8x1)                                   # 八边形x轴位置2,正八边形内角135度# 八边形x轴位置2,正八边形内角135度INTsize0,INTsize5,INTsize6,INTsize8=0,0,0,0if STRfilenameoutflag=="0" or STRfilenameoutflag=="9":                  # 圆形STRfilenameout0=STRfilenamein[0:len(STRfilenamein)-4]+"-circle.png" # 圆形输出文件名称FILEIMGhandleout0=Image.new('RGBA', (round(INTlengthuse),round(INTlengthuse)),(255,255,255,0))# 圆形输出文件IMGPIMhandleout0=FILEIMGhandleout0.load()                           # 圆形加载输出像素if STRfilenameoutflag=="5" or STRfilenameoutflag=="9":                  # 五边形STRfilenameout5=STRfilenamein[0:len(STRfilenamein)-4]+"-pentagon.png"# 五边形输出文件名称FILEIMGhandleout5=Image.new('RGBA', (round(INTlengthuse),round(INTlengthuse)),(255,255,255,0))# 五边形输出文件IMGPIMhandleout5=FILEIMGhandleout5.load()                           # 五边形加载输出像素if STRfilenameoutflag=="6" or STRfilenameoutflag=="9":                  # 六边形STRfilenameout6=STRfilenamein[0:len(STRfilenamein)-4]+"-hexagon.png"# 六边形输出文件名称FILEIMGhandleout6=Image.new('RGBA', (round(INTlengthuse),round(INTlengthuse)),(255,255,255,0))# 六边形输出文件IMGPIMhandleout6=FILEIMGhandleout6.load()                           # 六边形加载输出像素if STRfilenameoutflag=="8" or STRfilenameoutflag=="9":                  # 八边形STRfilenameout8=STRfilenamein[0:len(STRfilenamein)-4]+"-octagon.png"# 八边形输出文件名称FILEIMGhandleout8=Image.new('RGBA', (round(INTlengthuse),round(INTlengthuse)),(255,255,255,0))# 八边形输出文件IMGPIMhandleout8=FILEIMGhandleout8.load()                           # 八边形加载输出像素IMGPIMhandlein=FILEIMGhandlein.load()                                   # 加载输入像素 INToldpercent=0INTscale=1INTfornumber=INTlengthuse**2for INTposx in range(INTlengthuse): for INTposy in range(INTlengthuse):INTnewpercent=round(INTscale/INTfornumber*100)if INTnewpercent>INToldpercent:INToldpercent=INTnewpercentINTcnttime=round(time.perf_counter()-INTbegintime)os.system("clear")print("正在处理{},坐标{:>4}*{:>4}的像素,耗时{:>3}秒,完成{:>2}%".format(STRfilenamein,INTposx,INTposy,INTcnttime,INTnewpercent))if STRfilenameoutflag=="0" or STRfilenameoutflag=="9":          # 圆形if FUNCcircle(INTposx,INTposy,INTlengthuse,FLOAT921):IMGPIMhandleout0[INTposx,INTposy]=IMGPIMhandlein[INTposx,INTposy]if STRfilenameoutflag=="5" or STRfilenameoutflag=="9":          # 五边形if FUNCpentagon(INTposx,INTposy,INTlengthuse,FLOAT921,FLOAT5x1,FLOAT5x2,FLOAT5y1,FLOATtan18,FLOATtan36):IMGPIMhandleout5[INTposx,INTposy]=IMGPIMhandlein[INTposx,INTposy]if STRfilenameoutflag=="6" or STRfilenameoutflag=="9":          # 六边形if FUNChexagon(INTposx,INTposy,INTlengthuse,FLOAT921,FLOAT6x1,FLOAT6x2,FLOATtan30):IMGPIMhandleout6[INTposx,INTposy]=IMGPIMhandlein[INTposx,INTposy]if STRfilenameoutflag=="8" or STRfilenameoutflag=="9":          # 八边形if FUNCoctagon(INTposx,INTposy,INTlengthuse,FLOAT921,FLOAT8x1,FLOAT8x2,FLOATtan45):IMGPIMhandleout8[INTposx,INTposy]=IMGPIMhandlein[INTposx,INTposy]INTscale+=1if STRfilenameoutflag=="0" or STRfilenameoutflag=="9":                  # 圆形FILEIMGhandleout0.save(STRfilenameout0)                             # 圆形输出文件if STRfilenameoutflag=="5" or STRfilenameoutflag=="9":                  # 五边形FILEIMGhandleout5.save(STRfilenameout5)                             # 五边形输出文件if STRfilenameoutflag=="6" or STRfilenameoutflag=="9":                  # 六边形FILEIMGhandleout6.save(STRfilenameout6)                             # 六边形输出文件if STRfilenameoutflag=="8" or STRfilenameoutflag=="9":                  # 八边形FILEIMGhandleout8.save(STRfilenameout8)                             # 八边形输出文件else:print("图形文件:"+STRfilenamein+"不存在!")INTcnttime=round(time.perf_counter()-INTbegintime)        return INTcnttime################################################################################
### 计算圆形是否拷贝像素
################################################################################
def FUNCcircle(INTposx,INTposy,INTlengthuse,FLOAT921):LOGIMGwrite=FalseFLOAT000=pow(pow(abs(INTposx-FLOAT921),2)+pow(abs(INTposy-FLOAT921),2),0.5) # 当前像素到圆心距离if FLOAT000<FLOAT921:LOGIMGwrite=Truereturn LOGIMGwrite################################################################################
### 计算五边形是否拷贝像素
################################################################################
def FUNCpentagon(INTposx,INTposy,INTlengthuse,FLOAT921,FLOAT5x1,FLOAT5x2,FLOAT5y1,FLOATtan18,FLOATtan36):LOGIMGwrite=Falseif   (INTposx<FLOAT921 and INTposy<FLOAT5y1) or (INTposx>FLOAT921 and INTposy<FLOAT5y1):if INTposy/abs(FLOAT921-INTposx)>FLOATtan36:LOGIMGwrite=Trueelif INTposx<FLOAT5x1 and INTposy>FLOAT5y1:if INTposx/abs(FLOAT5y1-INTposy)>FLOATtan18:LOGIMGwrite=Trueelif INTposx>FLOAT5x2 and INTposy>FLOAT5y1:if abs(INTlengthuse-INTposx)/abs(FLOAT5y1-INTposy)>FLOATtan18:LOGIMGwrite=Trueelse:LOGIMGwrite=Truereturn LOGIMGwrite################################################################################
### 计算六边形是否拷贝像素
################################################################################
def FUNChexagon(INTposx,INTposy,INTlengthuse,FLOAT921,FLOAT6x1,FLOAT6x2,FLOATtan30):LOGIMGwrite=Falseif   (INTposx<FLOAT6x1 and INTposy<FLOAT921) or (INTposx<FLOAT6x1 and INTposy>FLOAT921):if INTposx/abs(FLOAT921-INTposy)>FLOATtan30:LOGIMGwrite=Trueelif (INTposx>FLOAT6x2 and INTposy<FLOAT921) or (INTposx>FLOAT6x2 and INTposy>FLOAT921):if abs(INTlengthuse-INTposx)/abs(FLOAT921-INTposy)>FLOATtan30:LOGIMGwrite=Trueelse:LOGIMGwrite=Truereturn LOGIMGwrite################################################################################
### 计算八边形是否拷贝像素
################################################################################
def FUNCoctagon(INTposx,INTposy,INTlengthuse,FLOAT921,FLOAT8x1,FLOAT8x2,FLOATtan45):LOGIMGwrite=Falseif   INTposx<FLOAT8x1 and INTposy<FLOAT8x1:if INTposx/abs(FLOAT8x1-INTposy)>FLOATtan45:LOGIMGwrite=Trueelif INTposx<FLOAT8x1 and INTposy>FLOAT8x2:if INTposx/abs(FLOAT8x2-INTposy)>FLOATtan45:LOGIMGwrite=Trueelif INTposx>FLOAT8x2 and INTposy<FLOAT8x1:if abs(INTlengthuse-INTposx)/abs(FLOAT8x1-INTposy)>FLOATtan45:LOGIMGwrite=Trueelif INTposx>FLOAT8x2 and INTposy>FLOAT8x2:if abs(INTlengthuse-INTposx)/abs(FLOAT8x2-INTposy)>FLOATtan45:LOGIMGwrite=Trueelse:LOGIMGwrite=Truereturn LOGIMGwrite################################################################################
### 打印主程序菜单,输入功能耗时,标准输出
################################################################################
def FUNCmenu(INTLISTcnttime):INTbegintime=time.perf_counter()os.system("clear")                                                          # 清屏print("将原始图片转换为指定形状的png透明图片,配置文件convertimage.cfg >>>>>>>>>")print("        0............转换圆形图,耗时{:>3}秒".format(INTLISTcnttime[0]))print("        5............转换五边形图,耗时{:>3}秒".format(INTLISTcnttime[1]))print("        6............转换六边形图,耗时{:>3}秒".format(INTLISTcnttime[2]))print("        8............转换八边形图,耗时{:>3}秒".format(INTLISTcnttime[3]))print("        9............转换全部图形,耗时{:>3}秒".format(INTLISTcnttime[4]))print("        Quit.........退出程序")INTcnttime=round(time.perf_counter()-INTbegintime)return INTcnttime################################################################################
### 读取配置文件
################################################################################
def FUNCreadcfg(STRcfgfilename):STRLISTfilenamein=[]STRprinttext=""if os.path.exists(STRcfgfilename):FILEhandlein=open(STRcfgfilename)STRLISTfilenamein=FILEhandlein.readlines()FILEhandlein.close()else:STRprinttext="(配置文件:"+STRcfgfilename+"不存在)"return STRLISTfilenamein,STRprinttext### 程序主体部分
while True:INTcnttime=FUNCmenu(INTLISTcnttime)STRLISTfilenamein,STRprinttext=FUNCreadcfg("convertimage.cfg")STRinput=input("        >>>>>>>>> 请输入选择项"+STRprinttext+":")STRinput=STRinput.lower()                                                   # 将输入项转换为小写if len(STRinput) !=1:continueelif STRinput not in "05689qe":continueelif STRinput=="0":INTLISTcnttime[0]=FUNCconvertimage(STRLISTfilenamein,STRinput)elif STRinput=="5":INTLISTcnttime[1]=FUNCconvertimage(STRLISTfilenamein,STRinput)elif STRinput=="6":INTLISTcnttime[2]=FUNCconvertimage(STRLISTfilenamein,STRinput)elif STRinput=="8":INTLISTcnttime[3]=FUNCconvertimage(STRLISTfilenamein,STRinput)elif STRinput=="9":INTLISTcnttime[4]=FUNCconvertimage(STRLISTfilenamein,STRinput)elif STRinput in "qe":breakelse:continue################################################################################
### math模块说明
################################################################################
# 函数                说明                                                  实例
# math.e        自然常数e                                                   >>> math.e   2.718281828459045
# math.pi       圆周率pi                                                   >>> math.pi   3.141592653589793
# math.degrees(x)   弧度转度                                                    >>> math.degrees(math.pi)   180.0
# math.radians(x)   度转弧度                                                    >>> math.radians(45)   0.7853981633974483
# math.exp(x)       返回e的x次方                                         >>> math.exp(2)   7.38905609893065
# math.expm1(x)     返回e的x次方减1                                           >>> math.expm1(2)   6.38905609893065
# math.log(x[, base])   返回x的以base为底的对数,base默认为e                  >>> math.log(math.e)   1.0   >>> math.log(2, 10)   0.30102999566398114
# math.log10(x)     返回x的以10为底的对数                                    >>> math.log10(2)   0.30102999566398114
# math.log1p(x)     返回1+x的自然对数(以e为底)                         >>> math.log1p(math.e-1)   1.0
# math.pow(x, y)    返回x的y次方                                         >>> math.pow(5,3)   125.0
# math.sqrt(x)      返回x的平方根                                         >>> math.sqrt(3)   1.7320508075688772
# math.ceil(x)      返回不小于x的整数                                           >>> math.ceil(5.2)   6.0
# math.floor(x)     返回不大于x的整数                                           >>> math.floor(5.8)   5.0
# math.trunc(x)     返回x的整数部分                                            >>> math.trunc(5.8)   5
# math.modf(x)      返回x的小数和整数                                           >>> math.modf(5.2)   (0.20000000000000018, 5.0)
# math.fabs(x)      返回x的绝对值                                         >>> math.fabs(-5)   5.0
# math.fmod(x, y)   返回x%y(取余)                                         >>> math.fmod(5,2)   1.0
# math.fsum([x, y, ...])返回无损精度的和                                    >>> 0.1+0.2+0.3   0.6000000000000001   >>> math.fsum([0.1, 0.2, 0.3])   0.6
# math.factorial(x) 返回x的阶乘                                                  >>> math.factorial(5)   120
# math.isinf(x)     若x为无穷大,返回True;否则,返回False                   >>> math.isinf(1.0e+308)   False   >>> math.isinf(1.0e+309)   True
# math.isnan(x)     若x不是数字,返回True;否则,返回False                   >>> math.isnan(1.2e3)   False
# math.hypot(x, y)  返回以x和y为直角边的斜边长                                  >>> math.hypot(3,4)   5.0
# math.copysign(x, y)   若y<0,返回-1乘以x的绝对值;# 否则,返回x的绝对值   >>> math.copysign(5.2, -1)   -5.2
# math.frexp(x)     返回m和i,满足m乘以2的i次方                                 >>> math.frexp(3)   (0.75, 2)
# math.ldexp(m, i)  返回m乘以2的i次方                                          >>> math.ldexp(0.75, 2)   3.0
# math.sin(x)       返回x(弧度)的三角正弦值                                 >>> math.sin(math.radians(30))   0.49999999999999994
# math.asin(x)      返回x的反三角正弦值                                          >>> math.asin(0.5)   0.5235987755982989
# math.cos(x)       返回x(弧度)的三角余弦值                                 >>> math.cos(math.radians(45))   0.7071067811865476
# math.acos(x)      返回x的反三角余弦值                                          >>> math.acos(math.sqrt(2)/2)   0.7853981633974483
# math.tan(x)       返回x(弧度)的三角正切值                                 >>> math.tan(math.radians(60))   1.7320508075688767
# math.atan(x)      返回x的反三角正切值                                          >>> math.atan(1.7320508075688767)   1.0471975511965976
# math.atan2(x, y)  返回x/y的反三角正切值                                    >>> math.atan2(2,1)   1.1071487177940904
# math.sinh(x)      返回x的双曲正弦函数
# math.asinh(x)     返回x的反双曲正弦函数
# math.cosh(x)      返回x的双曲余弦函数
# math.acosh(x)     返回x的反双曲余弦函数
# math.tanh(x)      返回x的双曲正切函数
# math.atanh(x)     返回x的反双曲正切函数
# math.erf(x)       返回x的误差函数
# math.erfc(x)      返回x的余误差函数
# math.gamma(x)     返回x的伽玛函数
# math.lgamma(x)    返回x的绝对值的自然对数的伽玛函数

Python 转换圆形、五边形、六边形、八边形PNG图片相关推荐

  1. python 图片base64 编解码,转换成Opencv,PIL.Image图片格式

    Python PIL.Image和OpenCV图像格式相互转换 二进制打开图片文件,base64编解码转成Opencv格式: # coding: utf-8 import base64 import ...

  2. python动态图片转字符画_GIF动态图,视频?都能用Python转换成字符画图像

    字符画是一种由字母.标点或其他字符组成的图画,它产生于互联网时代,在聊天软件中使用较多,本文我们看一下如何将自己喜欢的图片转成字符画. 静态图片 首先,我们来演示将静态图片转为字符画,功能实现主要用到 ...

  3. 基于Python的DICOM文件转换教程,使用pydicom将图片存为DICOM文件。

    基于Python的DICOM文件转换教程,使用pydicom将图片存为DICOM文件. DICOM是医学图像和信息的数字化标准,可用于将医学影像数据.诊断报告等信息在医疗领域进行传输.分享和分析.而常 ...

  4. python生成圆形_python生成圆形图片的方法

    本文实例为大家分享了python生成圆形图片的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- """ __author__= 'Du' ...

  5. canvas全局合成画月牙_GIF动态图,视频?都能用Python转换成字符画图像

    字符画是一种由字母.标点或其他字符组成的图画,它产生于互联网时代,在聊天软件中使用较多,本文我们看一下如何将自己喜欢的图片转成字符画. 静态图片 首先,我们来演示将静态图片转为字符画,功能实现主要用到 ...

  6. python小游戏编程arcade----坦克动画图片合成

    python小游戏编程arcade----坦克动画图片合成 前言 坦克动画图片合成 1.PIL image 1.1 读取文件并转换 1.2 裁切,粘贴 1.3 效果图 1.4 代码实现 2.处理图片的 ...

  7. python学习之手把手教你将图片变成黑白或彩色字符画(骚操作)

    文章目录 前言 一.字符画的实现原理 二.黑白字符画实现代码 三.彩色字符画生成 代码实现: 总结 前言 字符画这个话题,似乎早在贴吧时代就已经被玩烂了.在百度图片随便一搜索,就能够看到非常多.然后在 ...

  8. Python转换图像格式,超全

    人生苦短,快学Python! 最近我遇到了Python转换图像格式问题,正好干脆总结了一波,将一些奇怪的图片格式(webp格式.jfif格式.svg格式)转换为常见的jpg.png图片格式. jfif ...

  9. 使用python和PyQt5编写爬取百度图片的界面工具

    使用python和PyQt5编写爬取百度图片的界面工具 本篇文章的主要内容是展示我个人编写的,以界面小工具的方式爬取百度上面的图片,功能很单一,根据关键词爬取图片,代码很简单,新手上路请多指教. 代码 ...

最新文章

  1. CNN结构设计技巧-兼顾速度精度与工程实现
  2. 引入三方库_关于使用第三方库、代码复用的一些思考
  3. mysql5.7.13.zip安装(windows)
  4. 飞桨PaddlePaddle送算力 | 每日登录即送12小时,连续5天还有加送!
  5. OpenGL coordinate systems坐标系统的实例
  6. postfix文档修正
  7. 2017西安交大ACM小学期数论 [水题]
  8. 北京大学数学科学学院2006/9/20声明:坚持真理、追求卓越zz
  9. MySQL 基本信息的查询(初始化配置信息 my.ini)
  10. 安装pkgconfig_一个R包怎么也安装不上,憋着急!
  11. WIN10下的ios开发
  12. 苹果上网本报价_比iPhone还便宜,这是你能买到最香的苹果笔记本!?
  13. 基于STM32的小游戏——谷歌小恐龙(Chrome Dino Game)
  14. 科学家揭开宿醉原因:酒后身体缺水导致
  15. 模拟htonl、ntohl、htons、ntohs函数实现
  16. 百度站长“快速收录”获取方法分享步骤流程
  17. C# Windows-API-Code-Pack for .Net
  18. 易中天品汉代风云人物03:袁盎与士
  19. Python爬虫与Opencv结合,制作一款自己的拍照翻译程序!
  20. 小白自学人工智能_神经网络_图像处理之安装软件之师兄的嘱托

热门文章

  1. ps 图层解锁后变成全格子(全透明)的解决方法
  2. 重启explore(桌面进程)
  3. 失眠尽快入睡小妙招,这些助眠产品可以帮助睡眠
  4. 全国300城市交通违章查询api
  5. 校内互测题 by LMY (FSN)
  6. 12092009小记
  7. 国开电大 钢--混凝土组合结构 形成性考核1-4
  8. python能够设置标签背景色的属性是_Python Pmw EntryField背景色属性
  9. Docker下载和设置代理
  10. 小米oj 找到第 N 个数字 II