Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def preprocess_file(name, content, PIL_filter=Image.BILINEAR):
- """
- Preprocess files before storing. E.g: optimizing images
- """
- #full_path = self.path(name)
- #content.close()
- start = datetime.datetime.now()
- type_guesser = magic.Magic()
- if not content:
- return content
- content.seek(0)
- type_guessed = type_guesser.from_buffer(content.read(1024))
- logger.debug('Filetype guessed: "%s"' % type_guessed)
- if type_guessed.upper().startswith('JPEG IMAGE'): # Optimize via jpegoptim + jpegtran
- logger.debug('Preprocessing as JPEG image.')
- sh = Sh()
- ## 1st step: shrink to up to 1920x1920px (2 to 4 megapixels)
- inner_start = datetime.datetime.now()
- max_size = 1920 # px
- content.seek(0)
- im = Image.open(content)
- if any([size > max_size for size in im.size]):
- new_content_stream = StringIO.StringIO()
- #im.thumbnail([max_size, max_size], Image.ANTIALIAS) # 2.9 sec
- #im.thumbnail([max_size, max_size], Image.BICUBIC) # 1.6 sec
- #im.thumbnail([max_size, max_size], Image.BILINEAR) # 0.9 sec
- #im.thumbnail([max_size, max_size], Image.NEAREST) # 0.7 sec
- im.thumbnail([max_size, max_size], PIL_filter)
- im.save(new_content_stream, format='JPEG')
- new_content_stream.seek(0)
- new_content = ContentFile(new_content_stream.read())
- new_content.name = content.name
- content = new_content
- inner_finish = datetime.datetime.now()
- logger.debug('Preprocessed: shrinked to %sx%spx via PIL in %s' % (im.size[0], im.size[1], unicode(inner_finish-inner_start)))
- ##
- # Prepare to use *nix system tools from shell
- content.seek(0)
- temporary_file = tempfile.NamedTemporaryFile()
- temporary_file.write(content.read())
- temporary_file.flush()
- ## 2nd step: optimize it
- inner_start = datetime.datetime.now()
- returncode, stdout, stderr = sh.jpegoptim('--preserve', temporary_file.name)
- inner_finish = datetime.datetime.now()
- stdout = stdout.split('\n')[0]
- logger.debug('Preprocessed: size optimized via "jpegoptim" in %s : "%s"' % (unicode(inner_finish-inner_start), stdout))
- ##
- ## 3rd step: convert to progressive if file size > 10kb
- if os.path.getsize(temporary_file.name) > 10240: # 10 kilobytes = 10240 bytes
- inner_start = datetime.datetime.now()
- returncode, stdout, stderr = sh.jpegtran('-copy all -progressive -outfile', temporary_file.name, temporary_file.name)
- inner_finish = datetime.datetime.now()
- logger.debug('Preprocessed: >10kb file got progressive via "jpegtran" in %s' % unicode(inner_finish-inner_start))
- ##
- preprocessed = File(open(temporary_file.name))
- else:
- logger.debug('Not preprocessing this file.')
- preprocessed = content
- if content == preprocessed:
- new_content = content
- else:
- preprocessed.seek(0)
- new_content = ContentFile(preprocessed.read())
- new_content.name = content.name
- preprocessed.close()
- finish = datetime.datetime.now()
- logger.debug('Time spent preprocessing: %s' % unicode(finish-start))
- return new_content
Add Comment
Please, Sign In to add comment