2013-12-13 96 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)