2011-05-30 6 views
5

मैं अपनी परियोजना में userProfile मॉडल में मूल उपयोगकर्ता छवि को सहेजते समय थंबनेल छवि बनाने और सहेजने का प्रयास कर रहा हूं, नीचे मेरा कोड है:पीआईएल थंबनेल सही ढंग से आकार क्यों नहीं बदल रहा है?

def save(self, *args, **kwargs): 
    super(UserProfile, self).save(*args, **kwargs) 
    THUMB_SIZE = 45, 45 
    image = Image.open(join(MEDIA_ROOT, self.headshot.name)) 

    fn, ext = os.path.splitext(self.headshot.name) 
    image.thumbnail(THUMB_SIZE, Image.ANTIALIAS)   
    thumb_fn = fn + '-thumb' + ext 
    tf = NamedTemporaryFile() 
    image.save(tf.name, 'JPEG') 
    self.headshot_thumb.save(thumb_fn, File(open(tf.name)), save=False) 
    tf.close() 

    super(UserProfile, self).save(*args, **kwargs) 

प्रत्येक चीज ठीक काम कर रही है, बस यह एक बात है।

समस्या यह है कि थंबनेल फ़ंक्शन केवल चौड़ाई को 45 पर सेट करता है और छवि के अनुपात पहलू को नहीं बदलता है, इसलिए मुझे उस छवि के लिए 45*35 की एक छवि मिल रही है जिसे मैं परीक्षण कर रहा हूं (लघु छवि)।

क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं? पहलू अनुपात को मैं कैसे मजबूर करूं?

पीएस .: मैंने आकार के लिए सभी विधियों का प्रयास किया है: tupal: THUMB_SIZE = (45, 45) और सीधे थंबनेल फ़ंक्शन पर आकार दर्ज करना।

एक और सवाल: पीआईएल में आकार बदलने और थंबनेल कार्यों के बीच क्या अंतर है? आकार का उपयोग कब करें और थंबनेल का उपयोग कब करें?

उत्तर

12

image.thumbnail() फ़ंक्शन मूल छवि के पहलू अनुपात को बनाए रखेगा।

इसके बजाय image.resize() का उपयोग करें।

अद्यतन

image = image.resize(THUMB_SIZE, Image.ANTIALIAS)   
thumb_fn = fn + '-thumb' + ext 
tf = NamedTemporaryFile() 
image.save(tf.name, 'JPEG') 
+1

http://www.pythonware.com/library/pil/handbook/image.htm#Image.thumbnail देखें – Exelian

+0

अच्छा, मैं करने के लिए लिंक संलग्न करेंगे मेरा उत्तर =) – BFil

+0

10x, लेकिन मैंने image.resize (THUMB_SIZE, Image.ANTIALIAS) भी कोशिश की है जहां THUMB_RESIZE एक tupal (THUMB_RESIZE = (45,45) है और यह अभी भी आकार बदल नहीं रहा है ... कोई भी चीज़ और यहाँ पर? (यही वह है जो मैंने लिंक में पढ़ा है) ... धन्यवाद :-) – Erez

4

को देखते हुए:

import Image # Python Imaging Library 
THUMB_SIZE= 45, 45 
image # your input image 

आप आकार 45 × 45 के लिए किसी भी छवि का आकार करने के लिए चाहते हैं, तो आप का उपयोग करना चाहिए:

new_image= image.resize(THUMB_SIZE, Image.ANTIALIAS) 

हालांकि, अगर आप आकार 45 × 45 के परिणामस्वरूप छवि चाहते हैं जबकि इनपुट छवि को आकार में बदल दिया गया है पहलू अनुपात और काले के साथ लापता पिक्सल भरने:

new_image= Image.new(image.mode, THUMB_SIZE) 
image.thumbnail(THUMB_SIZE, Image.ANTIALIAS) # in-place 
x_offset= (new_image.size[0] - image.size[0]) // 2 
y_offset= (new_image.size[1] - image.size[1]) // 2 
new_image.paste(image, (x_offset, y_offset)) 
+0

मेरे पास पहले से ही जवाब है लेकिन धन्यवाद :-) – Erez

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^