您的位置:首页 > 编程语言 > Python开发

python:加水印小应用程序的实现

2018-01-15 13:46 399 查看
    在学习啦一段时间python之后,尝试着使用Python做一些图像处理方面的内容,这里编写了一个简单的加水印的小程序。主要用到了Python中自带的Tkinter标准GUI库和pillow图像处理库

    这两个库的学习本人主要是看相关的文档,最后面中会附有链接。功能很简单,实现的效果图如下:

   


       加水印实现代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2017-12-27 15:55:57
# @Author  : cfq (cfqpeter@qq.com)
# @Link    : ${link}
# @Version : $Id$

import sys
from PIL import Image,ImageDraw,ImageFont
import random
import watermark

# 随机颜色:
def rndColor():
return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255),90)

def watermark(s,*,path = None,image = None): #受限制的关键字参数
if  path:
im = Image.open(path).convert('RGBA')
if  image:
im = image

w,h = im.size
txt_im = Image.new('RGBA', im.size, (255,255,255,0))

draw = ImageDraw.Draw(txt_im)
font = ImageFont.truetype('C:/Windows/Fonts/Arial.ttf',40)
# 添加水印:
for c in range(len(s)):
draw.text((30*c+10, 10), s[c], font=font,fill = rndColor())

out = Image.alpha_composite(im, txt_im) #融合
return out

#运行测试
if __name__=='__main__':
args = sys.argv
if len(args) <3:
print('Error:Missing parameters')
sys.exit(0)

L = []
path = args[1] #获取图像路径
for i in range(2,len(args)):
L.append(args[i])
s = ''.join(L) #获取水印字符串
print('waterMark:',s)

res = watermark(s,path = path)
res.show()

界面代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2017-12-29 13:29:07
# @Author  : cfq (cfqpeter@qq.com)
# @Link    : ${link}
# @Version : $1.0$

'''[summary]
一个用来给图片添加水印的小程序
Tk 完成GUI界面
Pillow 完成加水印
[description]
'''
from tkinter import *
import tkinter.messagebox as messagebox
import tkinter.filedialog as filedialog
from PIL import Image,ImageTk
import watermark

class watermark_App(Frame):
def __init__(self,master = None):
Frame.__init__(self,master)
self.pack()
self.createWidgets()

def createWidgets(self):
frame1 = Frame(self)
frame1.pack() #包管理器
label1 = Label(frame1,text = "原始图像:")
self.canvas1 = Canvas(frame1,width = 256,height = 256,background = "white")
label2 = Label(frame1,text = "水印图像:")
self.canvas2 = Canvas(frame1,width = 256,height = 256,background = "white")

label1.grid(row=0,column=0)
label2.grid(row=0,column=1)
self.canvas1.grid(row=1,column=0)
self.canvas2.grid(row=1,column=1)

frame2 = Frame(self)
frame2.pack()
label = Label(frame2,text = "请输入图像地址:")
self.path = StringVar()
entry = Entry(frame2,textvariable = self.path,state='readonly')
label_mark = Label(frame2,text = "输入水印内容:")
self.mark = StringVar()
entry_mark = Entry(frame2,textvariable = self.mark)
label.grid(row=0,column=0)
entry.grid(row=0,column=1)
label_mark.grid(row=0,column=2)
entry_mark.grid(row=0,column=3)

frame3 = Frame(self)
frame3.pack()
btOpenImage = Button(frame3,text = "打开图片",command = self.openImage)
btOpenImage.grid(columnspan =3,sticky=W,padx=5,pady=3)

btProcess = Button(frame3,text = "处理",command = self.processButton)
btProcess.grid(row=0,column=3,columnspan=3,padx=5,sticky=E)

self.btSave = Button(frame3,text = "保存结果",state = DISABLED,command = self.saveImage)
self.btSave.grid(row=0,column=6,columnspan=3)

def openImage(self):
filename = filedialog.askopenfilename(initialdir='E:/',
filetypes=[("图像",".jpg .png .tif")],title='打开')#文件打开对话框
self.path.set(filename)
self.srcImageId = None
if filename:
self.srcImage = Image.open(filename).convert('RGBA')
self.tk_srcIm = ImageTk.PhotoImage(self.srcImage.resize((256,256)))
if self.srcImageId:
self.canvas1.delete(self.srcImageId)
self.srcImageId = None
self.srcImageId = self.canvas1.create_image(0,0,anchor = NW,image = self.tk_srcIm)

def processButton(self):
if self.srcImage:
mark = self.mark.get()
self.dstImageId = None
if mark:
self.dstImage = watermark.watermark(mark,image = self.srcImage) #加水印
self.tk_dstIm = ImageTk.PhotoImage(self.dstImage.resize((256,256)))
if self.dstImageId:
self.canvas2.delete(self.dstImageId)
self.dstImageId = None
self.dstImageId = self.canvas2.create_image(0,0,anchor = NW,image = self.tk_dstIm)
self.btSave.config(state = NORMAL) #激活保存按钮
else:
messagebox.showinfo('Error',"无水印!请输入要添加的水印内容")
else:
messagebox.showinfo('Error',"输入图像错误")

def saveImage(self):
filename = filedialog.asksaveasfilename(initialdir='E:/',defaultextension = 'png',title='保存') #文件保存对话框
if filename:
if self.dstImage:
self.dstImage.save(filename)

root = Tk()
root.resizable(0,0)
app = watermark_App(root)
app.master.title('水印生成工具')
app.mainloop()


学习链接:

pillow

TkinterBook

Tkinter之文件对话框

       
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐