diff --git a/app/logical/media_file/image.rb b/app/logical/media_file/image.rb index dab6a5dab..cb0b75e9d 100644 --- a/app/logical/media_file/image.rb +++ b/app/logical/media_file/image.rb @@ -38,26 +38,28 @@ class MediaFile::Image < MediaFile # @see https://github.com/jcupitt/libvips/wiki/HOWTO----Image-shrinking # @see http://jcupitt.github.io/libvips/API/current/Using-vipsthumbnail.md.html def preview(width, height) - if is_animated? - FFmpeg.new(file).smart_video_preview - else - output_file = Tempfile.new(["image-preview", ".jpg"]) - resized_image = image.thumbnail_image(width, height: height, **THUMBNAIL_OPTIONS) - resized_image.jpegsave(output_file.path, **JPEG_OPTIONS) - - MediaFile::Image.new(output_file) - end - end - - def crop(width, height) - output_file = Tempfile.new(["image-crop", ".jpg"]) - resized_image = image.thumbnail_image(width, height: height, **CROP_OPTIONS) + output_file = Tempfile.new(["image-preview", ".jpg"]) + resized_image = preview_frame.image.thumbnail_image(width, height: height, **THUMBNAIL_OPTIONS) resized_image.jpegsave(output_file.path, **JPEG_OPTIONS) MediaFile::Image.new(output_file) end - private + def crop(width, height) + output_file = Tempfile.new(["image-crop", ".jpg"]) + resized_image = preview_frame.image.thumbnail_image(width, height: height, **CROP_OPTIONS) + resized_image.jpegsave(output_file.path, **JPEG_OPTIONS) + + MediaFile::Image.new(output_file) + end + + def preview_frame + if is_animated? + FFmpeg.new(file).smart_video_preview + else + self + end + end def is_animated_gif? file_ext == :gif && image.get("n-pages") > 1 diff --git a/test/files/test-animated-256x256.png b/test/files/test-animated-256x256.png new file mode 100644 index 000000000..e1f6c289a Binary files /dev/null and b/test/files/test-animated-256x256.png differ diff --git a/test/files/test-animated-400x281.gif b/test/files/test-animated-400x281.gif new file mode 100644 index 000000000..f413d5ac2 Binary files /dev/null and b/test/files/test-animated-400x281.gif differ diff --git a/test/unit/media_file_test.rb b/test/unit/media_file_test.rb index ff0d6345d..b02432fd2 100644 --- a/test/unit/media_file_test.rb +++ b/test/unit/media_file_test.rb @@ -124,6 +124,8 @@ class MediaFileTest < ActiveSupport::TestCase should "generate a preview image for an animated image" do skip unless MediaFile.videos_enabled? assert_equal([86, 52], MediaFile.open("test/files/test-animated-86x52.gif").preview(150, 150).dimensions) + assert_equal([150, 105], MediaFile.open("test/files/test-animated-400x281.gif").preview(150, 150).dimensions) + assert_equal([150, 150], MediaFile.open("test/files/test-animated-256x256.png").preview(150, 150).dimensions) assert_equal([150, 150], MediaFile.open("test/files/apng/normal_apng.png").preview(150, 150).dimensions) end