2009-08-09 9 views
25

Tôi có một số vấn đề lạ với PIL không thay đổi kích thước hình ảnh.PIL Image.resize() không thay đổi kích thước hình ảnh

def handle_uploaded_image(i, u): 
    # resize image 
    from PIL import Image 
    img = Image.open(i) 
    if img.mode not in ('L', 'RGB'): 
     img = img.convert('RGB') 

    width, height = img.size 
    if width == height: 
     img.thumbnail(settings.THUMB_SIZE, Image.ANTIALIAS) 
    elif width > height: 
     ratio = floor(width/height) 
     newwidth = ratio * 150 
     newwidthhalf = floor(newwidth/2) 
     img.resize((newwidth, 150), Image.ANTIALIAS) 
     box = 1 
     img.crop((newwidthhalf, 0, 150, 150)) 
    elif height > width: 
     ratio = floor(height/width) 
     newheight = ratio * 150 
     newheighthalf = floor(newheight/2) 
     img.resize((150, newheight), image.ANTIALIAS) 
     box = 1 
     img.crop((0, newheighthalf, 150, 150)) 
    path = '/'.join([settings.MEDIA_ROOT, 'users', u.username, 'mugshotv2.jpg']) 
    img.save(path, format='JPEG') 

Mã này chạy mà không có bất kỳ lỗi nào và tạo hình ảnh có tên mugshotv2.jpg trong thư mục chính xác nhưng không đổi kích thước. Nó làm một cái gì đó với nó, bởi vì kích thước của hình ảnh giảm từ 120 kb đến 20 kb, nhưng kích thước vẫn giữ nguyên.

Có lẽ bạn cũng có thể đề xuất cách cắt hình ảnh thành hình vuông có ít mã hơn. Tôi nghĩ rằng Image.thumbnail làm điều đó, nhưng những gì nó đã làm là nó thu nhỏ hình ảnh của tôi đến 150 px theo chiều rộng của nó, để lại chiều cao 100px.

Alan.

Trả lời

71

resize() trả về bản sao đã chỉnh sửa kích thước của hình ảnh. Nó không sửa đổi bản gốc. Các cách chính xác để sử dụng nó là:

img = img.resize((150, newheight), image.ANTIALIAS) 

source

Tôi nghĩ rằng những gì bạn đang tìm kiếm được các chức năng ImageOps.fit. Từ PIL docs:

ImageOps.fit (hình ảnh, kích thước, phương pháp, chảy máu, định tâm) => hình ảnh

Trả về một phiên bản kích thước và cắt của hình ảnh, cắt để các yêu cầu tỉ lệ và kích thước. Kích thước đối số là kích thước đầu ra được yêu cầu tính bằng pixel, được cho dưới dạng chiều rộng (chiều rộng, chiều cao) tuple.

+2

Cảm ơn! Điều đó là vậy đó. Đây là một lần nữa sai lầm của loại ngu ngốc, dễ dàng này, mà tôi thường làm: P. Nhìn vào nó một lần nữa tôi không thể hiểu làm thế nào tôi đã không hiểu nó bản thân mình - đó là trong tài liệu chết tiệt sau khi tất cả. Tôi nghĩ tôi cần phải đi ngủ. Cảm ơn một lần nữa và bệnh thử rằng ImageOps.fit một số ngày khác: D –

+0

@Zayatzz, vì vậy chấp nhận câu trả lời của @ Nadia, đã, kể từ khi nó giải quyết vấn đề của bạn _and_ thậm chí cung cấp lời khuyên về cách tiếp cận tốt hơn! –

+3

Ah .. đó là dấu kiểm lạ .... ohwell. nó có thể sử dụng một cái gì đó để thu hút thêm sự chú ý đến nó. –