| Index: imageCompression.py |
| diff --git a/imageCompression.py b/imageCompression.py |
| deleted file mode 100644 |
| index 6ffe46aa3ec49e2403633c7c5d14c2e4346b7898..0000000000000000000000000000000000000000 |
| --- a/imageCompression.py |
| +++ /dev/null |
| @@ -1,82 +0,0 @@ |
| -# coding: utf-8 |
| - |
| -# This Source Code Form is subject to the terms of the Mozilla Public |
| -# License, v. 2.0. If a copy of the MPL was not distributed with this |
| -# file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| - |
| -import os |
| -import subprocess |
| -import threading |
| -import errno |
| -import logging |
| -from StringIO import StringIO |
| - |
| -try: |
| - from PIL import Image |
| -except ImportError: |
| - import Image |
| - |
| -use_pngout = True |
| - |
| -class Pngout: |
| - def __init__(self, image): |
| - args = ['pngout', '-', '-', '-q'] |
| - |
| - # Preserve mode for grayscale images. pngout tends to convert |
| - # everyting to palette. However, the toolbar icons for Safari |
| - # require the grayscale+alpha mode. Moreover, pngout seems to |
| - # generate smaller files when forced to preserve grayscale mode. |
| - if image.mode == 'LA' and any(px < 0xff for px in image.split()[1].getdata()): |
| - args.append('-c4') # grayscale+alpha |
| - elif Image.getmodebase(image.mode) == 'L': |
| - args.append('-c0') # grayscale |
| - |
| - self._pngout = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE) |
| - |
| - # Writing will block when the buffer is full until we read more data |
| - # from the output. Reading the output will block when the input isn't |
| - # complete yet. So we have to use threads to do both at the same time. |
| - self._thread = threading.Thread(target=self._run_thread, args=(image,)) |
| - self._thread.daemon = True |
| - self._thread.start() |
| - |
| - # This is supposed to be a file-like object, reading the compressed PNG file. |
| - # So proxy methods like read() to the stdout of the underlying subprocess. |
| - def __getattr__(self, name): |
| - return getattr(self._pngout.stdout, name) |
| - |
| - def _run_thread(self, image): |
| - image.save(self._pngout.stdin, 'PNG') |
| - self._pngout.stdin.close() |
| - |
| - def close(self): |
| - self._thread.join() |
| - self._pngout.stdout.close() |
| - self._pngout.wait() |
| - |
| -class ImageCompressor: |
| - use_pngout = True |
| - |
| - def make_uncompressed_file(self, image, filename): |
| - file = StringIO() |
| - file.name = filename # Set the 'name' attribute, so that PIL can determine |
| - # the correct image type based on the file extension |
| - image.save(file) |
| - file.seek(0) |
| - |
| - return file |
| - |
| - def make_file(self, image, filename): |
| - if self.use_pngout and os.path.splitext(filename)[1].lower() == '.png': |
| - try: |
| - return Pngout(image) |
| - except OSError, e: |
| - if e.errno != errno.ENOENT: |
| - raise |
| - |
| - logging.warning("Couldn't find 'pngout', can't compress images") |
| - self.use_pngout = False |
| - |
| - return self.make_uncompressed_file(image, filename) |
| - |
| -image_to_file = ImageCompressor().make_file |