2016-02-15 7 views
5

मैं Pillow, Django, और django-imagekit के साथ काम कर रहा हूं।किसी छवि को किसी विशिष्ट फ़ाइल आकार में परिवर्तित करने के लिए कैसे करें?

मैं एक प्रोफ़ाइल चित्र मॉडल फ़ील्ड (संभवतः ProcessedImageField वर्ग छवि का उपयोग कर) में सक्षम होने के लिए देख रहा हूं, जो किसी भी छवि को ले जाएगा, जेपीईजी में परिवर्तित करेगा, इसे 150x150 तक फसल करेगा, और इसकी फ़ाइल आकार 5 केबी बना देगा।

पहले दो आसान कर रहे हैं:

profile_picture = imagekit.models.ProcessedImageField(upload_to=get_profile_picture_file_path, 
                 format='JPEG', 
                 processors=[ResizeToFill(height=150, width=150)] 
                ) 

लेकिन मैं कैसे सुनिश्चित कर सकते फ़ाइल आकार 5KB है? मैं पैरामीटर जैसे ProcessedImageField में कुछ उपयोग कर सकता हूं, लेकिन ऐसा लगता है कि मूल फ़ाइल आकार (मेरे ज्ञान के लिए) के सापेक्ष ही लगता है।

समाधानों को django-imagekit का उपयोग करने की आवश्यकता नहीं है, लेकिन इसे प्राथमिकता दी जाएगी।

उत्तर

0

शायद इस तरह से। छवि का आकार की जाँच करें अपलोड करने के बाद और इसे हटाने या ओवरराइड save विधि में और अधिक कमी:

class Images(models.Model): 
    profile_picture = imagekit.models.ProcessedImageField(upload_to=get_profile_picture_file_path, 
                format='JPEG', 
                processors=[ResizeToFill(height=150, width=150)] 
               ) 

    def save(self, force_insert=False, force_update=False, using=None, 
      update_fields=None): 

     if os.stat(get_profile_picture_file_path + "/" + self.profile_picture.new_name).st_size > max_size: 
      do_something_further_image_processing_to_decrease_size 

     super(Images, self).save() 
+0

यह सत्यापित करता है कि फ़ाइल बहुत बड़ी है में एक अच्छी शुरुआत है, लेकिन 'do_something_further_image_processing_to_decrease_size' में तर्क वास्तव में सवाल के प्रासंगिक हिस्सा है। आप कैसे सुनिश्चित कर सकते हैं कि आप फ़ाइल आकार को किसी विशिष्ट आकार में कम कर रहे हैं, हर बार (विभिन्न संकल्पों/जेपीईजी गुणों की छवियों के साथ भी)? – dcgoss

+0

मैं शायद यहां पुनरावृत्ति फ़ंक्शन जोड़ूंगा जो संकल्प को प्रत्येक पुनरावृत्ति के उत्पादित आकार के वर्तमान आकार से संबंधित 10% या अन्य कारक द्वारा कम करता है। 'पीआईएल' आपको ऐसी संभावना देता है। – Magnar

0

मैं ने वही समस्या किया करते थे, तो मैं ओएस उपकरण (jpegoptim, optipng, आदि) का उपयोग कर छवियों का अनुकूलन करने का निर्णय लिया संकेतों का उपयोग कर मॉडल को बचाने के बाद django से बुलाया जाता है (आप विधि को भी ओवरडिन कर सकते हैं)। यह टूल आपकी छवियों से मेटाडेटा को अनुकूलित और खत्म करते हैं। दूसरी ओर में आप 150x150 की जेपीजी फ़ाइलों के लिए औसत संपीड़न अनुपात और आकार का अध्ययन करने और सेटअप करने के लिए अच्छी गुणवत्ता इस जाँच अनुमान लगाने का प्रयास कर सकता है: (jpeg compression ratio)

यह मेरा कोड का अनुकूलन फ़ाइलों के बाद उन्हें बचाने के लिए, मैं है मीटर आसान थंबनेल पुस्तकालय जो मेरे बाद बचाने के संकेतों को प्रदान का उपयोग कर:

@receiver(saved_file) 
def optimize_file(sender, fieldfile, **kwargs): 
    optimize(fieldfile.path) 


# thumbnail optimization 
@receiver(thumbnail_created) 
def optimize_thumbnail(sender, **kwargs): 
    optimize(sender.path) 

def optimize(path): 
    """ 
    install image utilities 
    apt-get install jpegoptim optipng pngcrush advancecomp 
    :param path: 
    :return: 
    """ 
    # taken from trimage (http://trimage.org/) 
    runString = { 
     ".jpeg": u"jpegoptim -f --strip-all '%(file)s' ; chmod 644 '%(file)s'", 
     ".jpg": u"jpegoptim -f --strip-all '%(file)s' ; chmod 644 '%(file)s'", 
     ".png": u"optipng -force -o7 '%(file)s' && advpng -z4 '%(file)s' && pngcrush -rem gAMA -rem alla -rem cHRM -rem iCCP -rem sRGB -rem time '%(file)s' '%(file)s.bak' && mv '%(file)s.bak' '%(file)s' ; chmod 644 '%(file)s'" 
    } 

    ext = splitext(path)[1].lower() 
    if ext in runString: 
     subprocess.Popen(runString[ext] % {'file': path}, shell=True) 
संबंधित मुद्दे

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