Created
January 3, 2017 07:21
-
-
Save limboinf/18a26510d30f50e26cb1f065f5077f64 to your computer and use it in GitHub Desktop.
Python生成1-9宫格头像
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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