Skip to content

Instantly share code, notes, and snippets.

@limboinf
Created January 3, 2017 07:21
Show Gist options
  • Save limboinf/18a26510d30f50e26cb1f065f5077f64 to your computer and use it in GitHub Desktop.
Save limboinf/18a26510d30f50e26cb1f065f5077f64 to your computer and use it in GitHub Desktop.
Python生成1-9宫格头像
# coding=utf-8
__author__ = 'fang'
import os
import uuid
import time
from common.qn import qiNiu
import urllib2
import cStringIO
from PIL import Image
from settings import image_collections
def ImageScale(url):
try:
file = cStringIO.StringIO(urllib2.urlopen(url).read())
img = Image.open(file)
return img
except:
pass
def make_thumb(im, size=100):
"""生成缩略图"""
width, height = im.size
# 裁剪图片成正方形
if width > height:
delta = (width - height) / 2
box = (delta, 0, delta+height, height)
region = im.crop(box)
elif height > width:
delta = (height - width) / 2
box = (0, delta, width, delta+width)
region = im.crop(box)
else:
region = im
thumb = region.resize((size, size), Image.ANTIALIAS)
thumb = circle(thumb)
return thumb
def merge_thumb(im_iterables, size=(340,340)):
"""合并图片"""
# 新建一个白色底的图片
merge_img = Image.new('RGBA', size, 0xe5e5e5) # 白色
w_padding, h_padding = 10, 10
chunk_im_iterables = chunks(im_iterables, 2)
if len(im_iterables) == 3:
chunk_im_iterables = [[im_iterables[0]], [im_iterables[1], im_iterables[2]]]
for index, img in enumerate(chunk_im_iterables):
# 把图片粘贴上去
im_size = img[0].size[0]
if index == 0:
if len(img) == 1:
merge_img.paste(img[0], (90, h_padding))
else:
for i, j in enumerate(img):
merge_img.paste(j, (w_padding * (i + 1) + (im_size * i), h_padding))
elif index == 1:
for i, j in enumerate(img):
merge_img.paste(j, (w_padding * (i + 1) + (im_size * i), h_padding * 2 + im_size))
else:
for i, j in enumerate(img):
merge_img.paste(j, (w_padding * (i + 1) + (im_size * i), h_padding * 3 + im_size * 2))
# 保持原图并上传至七牛云存储
gen_file_name = str(uuid.uuid4())+str(int(time.time()))
file_path = image_collections + gen_file_name + '.png'
if not os.path.exists(image_collections):
os.mkdir(image_collections)
merge_img.save(file_path)
q_url = qiNiu().uploadFile('teams', gen_file_name, file_path)
return q_url
def circle(ima):
size = ima.size
# 因为是要圆形,所以需要正方形的图片
r2 = min(size[0], size[1])
if size[0] != size[1]:
ima = ima.resize((r2, r2), Image.ANTIALIAS)
imb = Image.new('RGBA', (r2, r2), 0xe5e5e5) # 白色
# imb = Image.new('RGBA', (r2, r2)) # 透明
pima = ima.load()
pimb = imb.load()
r = float(r2/2) #圆心横坐标
for i in range(r2):
for j in range(r2):
lx = abs(i-r+0.5) #到圆心距离的横坐标
ly = abs(j-r+0.5)#到圆心距离的纵坐标
l = pow(lx,2) + pow(ly,2)
if l <= pow(r, 2):
pimb[i,j] = pima[i,j]
return imb
def chunks(arr, n):
'''
arr是被分割的list,n是每个chunk中含n元素。
'''
return [arr[i: i+n] for i in range(0, len(arr), n)]
if __name__ == '__main__':
#test
s = time.time()
img_url = "http://www.qqtn.com/up/2011-2/201121495218648.jpg"
imageUrls = (
img_url,
"http://img.zcool.cn/community/0331b3e554c741900000158fcefdfd7.jpg@250w_188h_1c_1e",
"http://image.zcool.com.cn/2013/32/0/m_1374216571289.jpg",
# "http://img.zcool.cn/community/033fd22554c734300000158fc577f10.jpg@250w_188h_1c_1e",
"http://image.zcool.com.cn/2011/03/114/58/m_1299928906662.jpg",
# "http://image.zcool.com.cn/2011/03/14/110/m_1299928505392.jpg",
# "http://img.zcool.cn/community/03396c7554c7ece00000158fc8a411a.jpg"
)
print '..............'
im_lists = [make_thumb(ImageScale(i), size=160) for i in imageUrls[:4]]
bs = merge_thumb(im_lists)
print bs
# print chunks(imageUrls, 2)
# print bs
# 上传头像
# path = user_server.upload_image(bs, "a5de37308a52cc492fd8e512284fa5dd", 381710, is_gziped=0)
# print path
e = time.time()
print e-s
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment