image resizing: Refactor some decisions into resize_tool.
Loading the thumb/medium sizes from the config, saving things to the db, and loading the image is now all done by resize_tool. It still calls resize_image for the actual work.
This commit is contained in:
parent
f96c284e0a
commit
3b359dddc7
@ -37,13 +37,14 @@ PIL_FILTERS = {
|
|||||||
'ANTIALIAS': Image.ANTIALIAS}
|
'ANTIALIAS': Image.ANTIALIAS}
|
||||||
|
|
||||||
|
|
||||||
def resize_image(proc_state, filename, new_path, exif_tags, workdir, new_size):
|
def resize_image(proc_state, resized, new_path, new_size,
|
||||||
|
exif_tags, workdir):
|
||||||
"""
|
"""
|
||||||
Store a resized version of an image and return its pathname.
|
Store a resized version of an image and return its pathname.
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
proc_state -- the processing state for the image to resize
|
proc_state -- the processing state for the image to resize
|
||||||
filename -- the filename of the original image being resized
|
resized -- an image from Image.open() of the original image being resized
|
||||||
new_path -- public file path for the new resized image
|
new_path -- public file path for the new resized image
|
||||||
exif_tags -- EXIF data for the original image
|
exif_tags -- EXIF data for the original image
|
||||||
workdir -- directory path for storing converted image files
|
workdir -- directory path for storing converted image files
|
||||||
@ -51,10 +52,6 @@ def resize_image(proc_state, filename, new_path, exif_tags, workdir, new_size):
|
|||||||
"""
|
"""
|
||||||
config = mgg.global_config['media_type:mediagoblin.media_types.image']
|
config = mgg.global_config['media_type:mediagoblin.media_types.image']
|
||||||
|
|
||||||
try:
|
|
||||||
resized = Image.open(filename)
|
|
||||||
except IOError:
|
|
||||||
raise BadMediaFail()
|
|
||||||
resized = exif_fix_image_orientation(resized, exif_tags) # Fix orientation
|
resized = exif_fix_image_orientation(resized, exif_tags) # Fix orientation
|
||||||
|
|
||||||
filter_config = config['resize_filter']
|
filter_config = config['resize_filter']
|
||||||
@ -74,6 +71,33 @@ def resize_image(proc_state, filename, new_path, exif_tags, workdir, new_size):
|
|||||||
mgg.public_store.copy_local_to_storage(tmp_resized_filename, new_path)
|
mgg.public_store.copy_local_to_storage(tmp_resized_filename, new_path)
|
||||||
|
|
||||||
|
|
||||||
|
def resize_tool(proc_state, force, keyname, target_name,
|
||||||
|
conversions_subdir, exif_tags):
|
||||||
|
# filename -- the filename of the original image being resized
|
||||||
|
filename = proc_state.get_queued_filename()
|
||||||
|
entry = proc_state.entry
|
||||||
|
max_width = mgg.global_config['media:' + keyname]['max_width']
|
||||||
|
max_height = mgg.global_config['media:' + keyname]['max_height']
|
||||||
|
# If the size of the original file exceeds the specified size for the desized
|
||||||
|
# file, a target_name file is created and later associated with the media
|
||||||
|
# entry.
|
||||||
|
# Also created if the file needs rotation, or if forced.
|
||||||
|
try:
|
||||||
|
im = Image.open(filename)
|
||||||
|
except IOError:
|
||||||
|
raise BadMediaFail()
|
||||||
|
if force \
|
||||||
|
or im.size[0] > max_width \
|
||||||
|
or im.size[1] > max_height \
|
||||||
|
or exif_image_needs_rotation(exif_tags):
|
||||||
|
filepath = create_pub_filepath(entry, target_name)
|
||||||
|
resize_image(
|
||||||
|
proc_state, im, filepath,
|
||||||
|
(max_width, max_height),
|
||||||
|
exif_tags, conversions_subdir)
|
||||||
|
proc_state.entry.media_files[keyname] = filepath
|
||||||
|
|
||||||
|
|
||||||
SUPPORTED_FILETYPES = ['png', 'gif', 'jpg', 'jpeg']
|
SUPPORTED_FILETYPES = ['png', 'gif', 'jpg', 'jpeg']
|
||||||
|
|
||||||
|
|
||||||
@ -117,29 +141,14 @@ def process_image(proc_state):
|
|||||||
gps_data = get_gps_data(exif_tags)
|
gps_data = get_gps_data(exif_tags)
|
||||||
|
|
||||||
# Always create a small thumbnail
|
# Always create a small thumbnail
|
||||||
thumb_filepath = create_pub_filepath(
|
resize_tool(proc_state, True, 'thumb',
|
||||||
entry, name_builder.fill('{basename}.thumbnail{ext}'))
|
name_builder.fill('{basename}.thumbnail{ext}'),
|
||||||
resize_image(proc_state, queued_filename, thumb_filepath,
|
conversions_subdir, exif_tags)
|
||||||
exif_tags, conversions_subdir,
|
|
||||||
(mgg.global_config['media:thumb']['max_width'],
|
|
||||||
mgg.global_config['media:thumb']['max_height']))
|
|
||||||
entry.media_files[u'thumb'] = thumb_filepath
|
|
||||||
|
|
||||||
# If the size of the original file exceeds the specified size of a `medium`
|
# Possibly create a medium
|
||||||
# file, a `.medium.jpg` files is created and later associated with the media
|
resize_tool(proc_state, False, 'medium',
|
||||||
# entry.
|
name_builder.fill('{basename}.medium{ext}'),
|
||||||
medium = Image.open(queued_filename)
|
conversions_subdir, exif_tags)
|
||||||
if medium.size[0] > mgg.global_config['media:medium']['max_width'] \
|
|
||||||
or medium.size[1] > mgg.global_config['media:medium']['max_height'] \
|
|
||||||
or exif_image_needs_rotation(exif_tags):
|
|
||||||
medium_filepath = create_pub_filepath(
|
|
||||||
entry, name_builder.fill('{basename}.medium{ext}'))
|
|
||||||
resize_image(
|
|
||||||
proc_state, queued_filename, medium_filepath,
|
|
||||||
exif_tags, conversions_subdir,
|
|
||||||
(mgg.global_config['media:medium']['max_width'],
|
|
||||||
mgg.global_config['media:medium']['max_height']))
|
|
||||||
entry.media_files[u'medium'] = medium_filepath
|
|
||||||
|
|
||||||
# Copy our queued local workbench to its final destination
|
# Copy our queued local workbench to its final destination
|
||||||
proc_state.copy_original(name_builder.fill('{basename}{ext}'))
|
proc_state.copy_original(name_builder.fill('{basename}{ext}'))
|
||||||
|
@ -286,7 +286,7 @@ class TestSubmission:
|
|||||||
# Does the processed image have a good filename?
|
# Does the processed image have a good filename?
|
||||||
filename = os.path.join(
|
filename = os.path.join(
|
||||||
public_store_dir,
|
public_store_dir,
|
||||||
*media.media_files.get(key, []))
|
*media.media_files[key])
|
||||||
assert filename.endswith('_' + basename)
|
assert filename.endswith('_' + basename)
|
||||||
# Is it smaller than the last processed image we looked at?
|
# Is it smaller than the last processed image we looked at?
|
||||||
size = os.stat(filename).st_size
|
size = os.stat(filename).st_size
|
||||||
|
Loading…
x
Reference in New Issue
Block a user