Created
March 8, 2014 21:37
-
-
Save 668/9439275 to your computer and use it in GitHub Desktop.
PIL 例子
This file contains hidden or 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 | |
''' | |
python图片处理 | |
''' | |
from PIL import Image as image | |
#等比例压缩图片 | |
def resizeImg(**args): | |
args_key = {'ori_img':'','dst_img':'','dst_w':'','dst_h':''} | |
arg = {} | |
for key in args_key: | |
if key in args: | |
arg[key] = args[key] | |
im = image.open(arg['ori_img']) | |
ori_w,ori_h = im.size | |
widthRatio = heightRatio = None | |
ratio = 1 | |
if (ori_w and ori_w > arg['dst_w']) or (ori_h and ori_h > arg['dst_h']): | |
if arg['dst_w'] and ori_w > arg['dst_w']: | |
widthRatio = float(arg['dst_w']) / ori_w #正确获取小数的方式 | |
if arg['dst_h'] and ori_h > arg['dst_h']: | |
heightRatio = float(arg['dst_h']) / ori_h | |
if widthRatio and heightRatio: | |
if widthRatio < heightRatio: | |
ratio = widthRatio | |
else: | |
ratio = heightRatio | |
if widthRatio and not heightRatio: | |
ratio = widthRatio | |
if heightRatio and not widthRatio: | |
ratio = heightRatio | |
newWidth = int(ori_w * ratio) | |
newHeight = int(ori_h * ratio) | |
else: | |
newWidth = ori_w | |
newHeight = ori_h | |
im.resize((newWidth,newHeight),image.ANTIALIAS).save(arg['dst_img']) | |
''' | |
image.ANTIALIAS还有如下值: | |
NEAREST: use nearest neighbour | |
BILINEAR: linear interpolation in a 2x2 environment | |
BICUBIC:cubic spline interpolation in a 4x4 environment | |
ANTIALIAS:best down-sizing filter | |
''' | |
#裁剪压缩图片 | |
def clipResizeImg(**args): | |
args_key = {'ori_img':'','dst_img':'','dst_w':'','dst_h':''} | |
arg = {} | |
for key in args_key: | |
if key in args: | |
arg[key] = args[key] | |
im = image.open(arg['ori_img']) | |
ori_w,ori_h = im.size | |
dst_scale = float(arg['dst_h']) / arg['dst_w'] #目标高宽比 | |
ori_scale = float(ori_h) / ori_w #原高宽比 | |
if ori_scale >= dst_scale: | |
#过高 | |
width = ori_w | |
height = int(width*dst_scale) | |
x = 0 | |
y = (ori_h - height) / 3 | |
else: | |
#过宽 | |
height = ori_h | |
width = int(height*dst_scale) | |
x = (ori_w - width) / 2 | |
y = 0 | |
#裁剪 | |
box = (x,y,width+x,height+y) | |
#这里的参数可以这么认为:从某图的(x,y)坐标开始截,截到(width+x,height+y)坐标 | |
#所包围的图像,crop方法与php中的imagecopy方法大为不一样 | |
newIm = im.crop(box) | |
im = None | |
#压缩 | |
ratio = float(arg['dst_w']) / width | |
newWidth = int(width * ratio) | |
newHeight = int(height * ratio) | |
newIm.resize((newWidth,newHeight),image.ANTIALIAS).save(arg['dst_img']) | |
#水印(这里仅为图片水印) | |
def waterMark(**args): | |
args_key = {'ori_img':'','dst_img':'','mark_img':'','water_opt':''} | |
arg = {} | |
for key in args_key: | |
if key in args: | |
arg[key] = args[key] | |
im = image.open(arg['ori_img']) | |
ori_w,ori_h = im.size | |
mark_im = image.open(arg['mark_img']) | |
mark_w,mark_h = mark_im.size | |
option ={'leftup':(0,0),'rightup':(ori_w-mark_w,0),'leftlow':(0,ori_h-mark_h), | |
'rightlow':(ori_w-mark_w,ori_h-mark_h) | |
} | |
im.paste(mark_im,option[arg['water_opt']],mark_im.convert('RGBA')) | |
im.save(arg['dst_img']) | |
#实例 | |
#原图 | |
ori_img = 'D:/tt.jpg' | |
#水印标 | |
mark_img = 'D:/mark.png' | |
#水印位置 | |
water_opt = 'rightlow' #右下 | |
#生成后的目标图(保存位置) | |
dst_img = 'D:/python.jpg' | |
dst_w = 200 | |
dst_h = 200 | |
#裁剪压缩 | |
clipResizeImg(ori_img=ori_img,dst_img=dst_img,dst_w=dst_w,dst_h=dst_h) | |
#等比例压缩 | |
#resizeImg(ori_img=ori_img,dst_img=dst_img,dst_w=dst_w,dst_h=dst_h) | |
#水印 | |
#waterMark(ori_img=ori_img,dst_img=dst_img,mark_img=mark_img,water_opt=water_opt) | |
#该片段来自于http://www.codesnippet.cn/detail/190620134166.html |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment