2013-12-13 94 views
0

我使用PIL调整上传到服务器的图像大小。我试过一个简单的算法来调整图像的最长边缘。但是当图像是肖像时,它正在裁剪一小部分。我想我在数学公式中犯了一个错误。任何帮助将不胜感激。PIL调整大小/缩略图裁剪图像(人像)的顶部位

def scale_to_size(im1, local_image, size): 
    width = int(config['image_sizes'][size]['width']) 
    height = int(config['image_sizes'][size]['height']) 

    wpercent = int((width/float(im1.size[0]))) 
    hsize = int((float(im1.size[1])*float(wpercent))) 
    im2 = im1.resize((wpercent, hsize), Image.ANTIALIAS) 

    scaled_img = _rewrite_file_name(local_image, size) 
    im2.save(scaled_img) 
    return scaled_img 

def _rewrite_file_name(path, size): 
    fileName, fileExt = os.path.splitext(path) 
    return fileName + "_" + size + fileExt 

if __name__ == '__main__': 
    size = 'medium' 
    img = '/Users/.../tmp/photo.JPG' 
    im1 = Image.open(img) 
    scale_to_size(im1, img, size) 

宽度: 小:180 介质:300 大:600

我一直在使用缩略图尝试,但没有工作了太清楚了。

回答

0

我认为你正在做太多int-> float float-> int转换。结果是,您丢失了一些信息,您也正在使用wpercent而不是width。您的代码已修复:

def scale_to_size(im1, local_image, size): 
    width = int(config['image_sizes'][size]['width']) 

    wpercent = float(width)/im1.size[0] 
    hsize = int(im1.size[1]*wpercent) 
    im2 = im1.resize((width, hsize), Image.ANTIALIAS) 

    scaled_img = _rewrite_file_name(local_image, size) 
    im2.save(scaled_img) 
    return scaled_img 

def _rewrite_file_name(path, size): 
    fileName, fileExt = os.path.splitext(path) 
    return fileName + "_" + size + fileExt 

if __name__ == '__main__': 
    size = 'medium' 
    img = '/Users/.../tmp/photo.JPG' 
    im1 = Image.open(img) 
    scale_to_size(im1, img, size)