Guest User

Untitled

a guest
Jun 18th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.61 KB | None | 0 0
  1. def preprocess_file(name, content, PIL_filter=Image.BILINEAR):
  2.         """
  3.        Preprocess files before storing. E.g: optimizing images
  4.        """
  5.         #full_path = self.path(name)
  6.         #content.close()
  7.         start = datetime.datetime.now()
  8.         type_guesser = magic.Magic()
  9.  
  10.         if not content:
  11.             return content
  12.  
  13.         content.seek(0)
  14.         type_guessed = type_guesser.from_buffer(content.read(1024))
  15.  
  16.         logger.debug('Filetype guessed: "%s"' % type_guessed)
  17.         if type_guessed.upper().startswith('JPEG IMAGE'): # Optimize via jpegoptim + jpegtran
  18.             logger.debug('Preprocessing as JPEG image.')
  19.             sh = Sh()
  20.  
  21.             ## 1st step: shrink to up to 1920x1920px (2 to 4 megapixels)
  22.             inner_start = datetime.datetime.now()
  23.             max_size = 1920 # px
  24.             content.seek(0)
  25.             im = Image.open(content)
  26.             if any([size > max_size for size in im.size]):
  27.                 new_content_stream = StringIO.StringIO()
  28.                 #im.thumbnail([max_size, max_size], Image.ANTIALIAS) # 2.9 sec
  29.                 #im.thumbnail([max_size, max_size], Image.BICUBIC) # 1.6 sec
  30.                 #im.thumbnail([max_size, max_size], Image.BILINEAR) # 0.9 sec
  31.                 #im.thumbnail([max_size, max_size], Image.NEAREST) # 0.7 sec
  32.                 im.thumbnail([max_size, max_size], PIL_filter)
  33.                 im.save(new_content_stream, format='JPEG')
  34.                 new_content_stream.seek(0)
  35.                 new_content = ContentFile(new_content_stream.read())
  36.                 new_content.name = content.name
  37.                 content = new_content
  38.             inner_finish = datetime.datetime.now()
  39.             logger.debug('Preprocessed: shrinked to %sx%spx via PIL in %s' % (im.size[0], im.size[1], unicode(inner_finish-inner_start)))
  40.             ##
  41.  
  42.             # Prepare to use *nix system tools from shell
  43.             content.seek(0)
  44.             temporary_file = tempfile.NamedTemporaryFile()
  45.             temporary_file.write(content.read())
  46.             temporary_file.flush()
  47.  
  48.             ## 2nd step: optimize it
  49.             inner_start = datetime.datetime.now()
  50.             returncode, stdout, stderr = sh.jpegoptim('--preserve', temporary_file.name)
  51.             inner_finish = datetime.datetime.now()
  52.             stdout = stdout.split('\n')[0]
  53.             logger.debug('Preprocessed: size optimized via "jpegoptim" in %s : "%s"' % (unicode(inner_finish-inner_start), stdout))
  54.             ##
  55.  
  56.             ## 3rd step: convert to progressive if file size > 10kb
  57.             if os.path.getsize(temporary_file.name) > 10240: # 10 kilobytes = 10240 bytes
  58.                 inner_start = datetime.datetime.now()
  59.                 returncode, stdout, stderr = sh.jpegtran('-copy all -progressive -outfile', temporary_file.name, temporary_file.name)
  60.                 inner_finish = datetime.datetime.now()
  61.                 logger.debug('Preprocessed: >10kb file got progressive via "jpegtran" in %s' % unicode(inner_finish-inner_start))
  62.             ##
  63.  
  64.             preprocessed = File(open(temporary_file.name))
  65.  
  66.         else:
  67.             logger.debug('Not preprocessing this file.')
  68.             preprocessed = content
  69.  
  70.         if content == preprocessed:
  71.             new_content = content
  72.         else:
  73.             preprocessed.seek(0)
  74.             new_content = ContentFile(preprocessed.read())
  75.             new_content.name = content.name
  76.             preprocessed.close()
  77.             finish = datetime.datetime.now()
  78.             logger.debug('Time spent preprocessing: %s' % unicode(finish-start))
  79.  
  80.         return new_content
Add Comment
Please, Sign In to add comment