def test_get_img_ext(self): """ get_img_ext should return the appropriate image type extension for file or a default ('unknown') if file cannot be deciphered. """ from garage.image_utils import get_img_ext self._msg('test', 'get_img_ext', first=True) path, fname, w, h, ext = self._get_test_image('rodents') result = get_img_ext(path) self.assertEqual(result, ext) self._msg('image', fname) self._msg('ext', ext) self._msg('result', result) path, fname, w, h, ext = self._get_test_image('monkeys1') result = get_img_ext(path) self.assertEqual(result, ext) self._msg('image', fname) self._msg('ext', ext) self._msg('result', result) path, fname, w, h, ext = self._get_test_image('monkeys2') result = get_img_ext(path) self.assertEqual(result, ext) self._msg('image', fname) self._msg('ext', ext) self._msg('result', result)
def test_create_thumb(self): """ create_thumb should generate a thumbnail of specified size and quality. * result should be, e.g., /path/to/thumb/thumb-245x136.jpg """ from garage.image_utils import ( create_thumb, get_image_size, get_img_ext, ) from garage.utils import delete_file self._msg('test', 'create_thumb', first=True) tempdir = tempfile.gettempdir() path, fname, w, h, ext = self._get_test_image('rodents') w, h = 245, 138 quality = 75 dst = tempdir fbase = 'rodents' thumb = create_thumb(path, w, h, quality, dst, fbase, ext) width, height = get_image_size(thumb) fext = get_img_ext(thumb) self.assertTrue(os.path.isfile(thumb)) self.assertEqual((width, height), (w, h)) self.assertEqual(fext, ext) self._msg('original', fname) self._msg('thumb', thumb) self._msg('width', width) self._msg('height', height) self._msg('ext', fext) self.assertTrue(delete_file(thumb))
def test_resize_image(self): """ resize_image should downsample an image and resize according to input dimensions. """ from garage.image_utils import ( resize_image, get_img_ext, get_file_basename, get_image_size, ) from garage.utils import delete_file self._msg('test', 'resize_image', first=True) tempdir = tempfile.gettempdir() path, fname, w, h, ext = self._get_test_image('rodents') fbase = 'rodents' w, h = 500, 280 dst = '%s-%dx%d.%s' % (os.path.join(tempdir, fbase), w, h, ext) img = Image.open(path) result = resize_image(img, (w, h), True) result.save(dst, quality=75) self.assertTrue(os.path.isfile(dst)) width, height = get_image_size(dst) fext = get_img_ext(dst) self.assertEqual((width, height), (w, h)) self.assertEqual(fext, ext) self._msg('original', dst) self._msg('resized', result) self._msg('width', width) self._msg('height', height) self._msg('ext', fext) self.assertTrue(delete_file(dst))
def test_generate_thumb(self): """ generate_thumb is a wrapper function for create_thumb, so should bahave identically with the same parameters. * result should be, e.g., /path/to/thumb/thumb-245x136.jpg """ from garage.image_utils import ( generate_thumb, get_image_size, get_img_ext, ) from garage.utils import delete_file self._msg('test', 'generate_thumb', first=True) tempdir = tempfile.gettempdir() path, fname, w, h, ext = self._get_test_image('rodents') w, h = 245, 138 quality = 75 dst = tempdir thumb = generate_thumb(path, w, h, quality, dst) width, height = get_image_size(thumb) fext = get_img_ext(thumb) self.assertTrue(os.path.isfile(thumb)) self.assertEqual((width, height), (w, h)) self.assertEqual(fext, ext) self._msg('original', fname) self._msg('thumb', thumb) self._msg('width', width) self._msg('height', height) self._msg('ext', fext) self.assertTrue(delete_file(thumb))
def save_to_remote_storage(path, storage=None): """ Push a local file to remote media storage. :param path: local path of file :param storage: storage instance to use (default: default_storage) :returns: url of file on remote storage server """ if not path or not os.path.isfile(path): logger().debug('save to remote storage - cannot find file: %s' % path) remote_path = path else: if not storage: storage = default_storage if storage == resources_storage: fkey = path.replace(RESOURCES_ROOT, '') else: fkey = path.replace(MEDIA_ROOT, '') # determine mime type fext = get_img_ext(path) content_type = MIME_TYPES.get(fext, UNKNOWN_MIME_TYPE) # write file to remote server file = storage.open(fkey, 'w') storage.headers.update({"Content-Type": content_type}) f = open(path, 'rb') media = File(f) for chunk in media.chunks(chunk_size=FILE_IO_CHUNK_SIZE): file.write(chunk) file.close() media.close() f.close() # construct remote url if storage == resources_storage: remote_path = '%s%s' % (RESOURCES_URL, fkey) else: remote_path = '%s%s' % (MEDIA_URL, fkey) logger().debug( 'save_to_remote_storage - local: %s / remote: %s / mime-type: %s' % (path, remote_path, content_type)) return remote_path
def get_image_ext(path, default_ext=None, use_path_ext=False): """ Return file name and extension for image. * if there's something wrong with the image, use the file name's extension as a replacement. :param path: image path :param default_ext: default extension if PIL can't determine image type :param use_path_ext: if True, get extension from file name :returns: file extension """ try: fext = get_img_ext(path, default_ext=None) assert fext except AssertionError: if use_path_ext: fname, fext = os.path.splitext(path) else: fext = default_ext return fext