使用Image包合成圖片 添加文字。
下面將通過實例介紹利用py PIL包對圖片進行合成,裁減以及添加文字。
原始圖片4張
合成后圖片:
圖片處理
圖片拼接
# 創建空白圖片
target = Image.new('RGBA', (width, hight+504), (255, 255, 255))
# 創建header Image對象,paste拼接到空白圖片指定位置target.paste(img_h, (0, 0))
img_h = img_header(os.path.join(tasktheme_img_path, task_img))
# 圖片合成paste 參數中img_h表示Image對象,(0, 0)表示x,y軸位置 單位像素 target的左上角為原點 y軸向下
target.paste(img_h, (0, 0))
生成圓形圖片
因為頭像圖片為方形,需要裁減成圓形圖片然后拼接。
裁減的原理是在正方形中畫出一個內切圓,四個角的像素為對應背景位置的像素
裁減的圓形圖片四個角的圖片需對應到背景圖
# 因為是要圓形,所以需要正方形的圖片
r2 = min(size[0], size[1])
if size[0] != size[1]:
ima = ima.resize((r2, r2), Image.ANTIALIAS)
# 最后生成圓的半徑
r3 = r2/2
imb = Image.new('RGBA', (r3*2, r3*2),(255,255,255,0))
pima = ima.load() # 像素的訪問對象
pimb = imb.load()
pim_back = img_back.load()
r = float(r2/2) #圓心橫坐標
for i in range(r2):
for j in range(r2):
lx = abs(i-r) #到圓心距離的橫坐標
ly = abs(j-r)#到圓心距離的縱坐標
l = (pow(lx,2) + pow(ly,2))** 0.5 # 三角函數 半徑
if l < r3-4:
pimb[i-(r-r3),j-(r-r3)] = pima[i,j]
elif l > r3:
# 大於半徑的像素為背景圖位置對應的像素,這樣顯示圓形頭像四個角才能正常顯示,pim_back為背景image對象
pimb[i-(r-r3),j-(r-r3)] = pim_back[i+35,j+327-50]
return imb
添加文字,線條
在linux上需要導入支持中文的simsun.ttc字庫,否則會亂碼
draw.text指定位置開始添加文字
draw.line指定位置開始畫線
font = ImageFont.truetype(os.path.join(os.getcwd(),'data','simsun.ttc'),26)
text = u'長按小程序碼'
draw.text((457, hight+331), text,fill='#999',font=font)
text = u'立即閱讀文章詳情'
draw.text((457, hight+366), text,fill='#999',font=font)
draw.line((10, hight+251, width-10, hight+251), fill='#eee')
完整代碼
from PIL import Image,ImageFont,ImageDraw
reload(sys)
sys.setdefaultencoding('utf8')
def img_author(fpath, img_back):
ima = Image.open(fpath).convert("RGBA")
ima = ima.resize((130, 130), Image.ANTIALIAS)
size = ima.size
# 因為是要圓形,所以需要正方形的圖片
r2 = min(size[0], size[1])
if size[0] != size[1]:
ima = ima.resize((r2, r2), Image.ANTIALIAS)
# 最后生成圓的半徑
r3 = r2/2
imb = Image.new('RGBA', (r3*2, r3*2),(255,255,255,0))
pima = ima.load() # 像素的訪問對象
pimb = imb.load()
pim_back = img_back.load()
r = float(r2/2) #圓心橫坐標
for i in range(r2):
for j in range(r2):
lx = abs(i-r) #到圓心距離的橫坐標
ly = abs(j-r)#到圓心距離的縱坐標
l = (pow(lx,2) + pow(ly,2))** 0.5 # 三角函數 半徑
if l < r3-4:
pimb[i-(r-r3),j-(r-r3)] = pima[i,j]
elif l > r3:
pimb[i-(r-r3),j-(r-r3)] = pim_back[i+35,j+327-50]
return imb
def img_header(fpath):
img = Image.open(fpath)
img = img.resize((718,327))
img = img.convert("RGBA")
return img
def img_logo(fpath):
img = Image.open(fpath)
img = img.resize((160,160))
im = Image.new('RGBA', img.size, (255,255,255))
x,y = img.size
im.paste(img, (0, 0, x, y), img)
return im
def img_applicationcode(fpath):
img = Image.open(fpath)
img = img.resize((180,180))
img = img.convert("RGBA")
return img
def wx_get_share_img(data):
task_img = data['task_img']
author_img = data['author_img']
author_name = data['author_name']
task_name = data['task_name']
roud_name = data['roud_name']
aid = data['aid']
tid = data['tid']
width = 718
hight = 327
save_name = str(aid)+'.jpg'
if os.path.exists(os.path.join(wx_share_path,save_name)):
return {'img':wx_share_url+save_name}
try:
target = Image.new('RGBA', (width, hight+504), (255, 255, 255))
img_h = img_header(os.path.join(tasktheme_img_path, task_img))
target.paste(img_h, (0, 0))
img_a = img_author(os.path.join(avatar_img_path, author_img),target)
target.paste(img_a, (35, hight-50))
img_l = img_logo(os.path.join(img_dir,'logo.png'))
target.paste(img_l, (30,hight+296))
# 獲取動態小程序碼
#img_l = img_applicationcode(os.path.join(img_dir,'applicationcode.jpg'))
img_l = miniprogram.getCodeUnlimit('aid=%s&tid=%s'%(aid,tid),'pages/index/story_detail/story_detail')
img_l = img_l.resize((160,160))
target.paste(img_l, (30+160+40,hight+296))
draw = ImageDraw.Draw(target)
font = ImageFont.truetype(os.path.join(os.getcwd(),'data','simsun.ttc'),32)
draw.text((30+130+15, hight+34), author_name.decode('utf-8'),fill='#009696',font=font)
font = ImageFont.truetype(os.path.join(os.getcwd(),'data','simsun.ttc'),34)
draw.text((30, hight+125), task_name.decode('utf-8'),fill='#000000',font=font)
font = ImageFont.truetype(os.path.join(os.getcwd(),'data','simsun.ttc'),30)
draw.text((30, hight+176), roud_name.decode('utf-8'),fill='#555',font=font)
font = ImageFont.truetype(os.path.join(os.getcwd(),'data','simsun.ttc'),26)
text = u'長按小程序碼'
draw.text((457, hight+331), text,fill='#999',font=font)
text = u'立即閱讀文章詳情'
draw.text((457, hight+366), text,fill='#999',font=font)
draw.line((10, hight+251, width-10, hight+251), fill='#eee')
# print help(draw)
target = target.convert("RGB")
target.save(os.path.join(wx_share_path, save_name))
return {'img':wx_share_url+save_name}
except Exception as e:
traceback.print_exc()
return {}