From b378785582900113b4c4c8bf21d35a8460a62456 Mon Sep 17 00:00:00 2001 From: evazion Date: Wed, 22 Sep 2021 10:52:17 -0500 Subject: [PATCH] Fix #3692: Rotate pictures based on metadata Rotate the image based on the EXIF orientation flag when generating thumbnails and samples. Also fix the width and height to be calculated correctly for rotated images. Vips gives us the unrotated width and height of the image; we have to detect whether the image is rotated and swap the width and height manually to correct them. For example, if an image with the "Rotate 90 CW" flag is 100x500 before rotation, then after rotation it's 500x100. This should fix #4883 (Exif rotation breaks Javascript fit-to-window) We also have to fix it so that regenerating a post updates the width and height of the post, in the event that it's a rotated image. Finally we set `image-orientation: from-image;` even though it's probably not necessary. --- app/javascript/src/styles/specific/posts.scss | 1 + app/logical/media_file/image.rb | 23 +++++++++-- app/models/post.rb | 14 +++++++ test/files/test-rotation-180.jpg | Bin 0 -> 30695 bytes test/files/test-rotation-270cw.jpg | Bin 0 -> 40731 bytes .../post_regenerations_controller_test.rb | 14 +++++++ test/unit/media_file_test.rb | 36 ++++++++++++++++++ 7 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 test/files/test-rotation-180.jpg create mode 100644 test/files/test-rotation-270cw.jpg diff --git a/app/javascript/src/styles/specific/posts.scss b/app/javascript/src/styles/specific/posts.scss index fba8ce4d4..628d2a10b 100644 --- a/app/javascript/src/styles/specific/posts.scss +++ b/app/javascript/src/styles/specific/posts.scss @@ -159,6 +159,7 @@ div#c-posts { .image-container { margin: 1em 0 0.5em; + image-orientation: from-image; &.danbirthday::before { content: ""; diff --git a/app/logical/media_file/image.rb b/app/logical/media_file/image.rb index 1d3c563c3..9d77c3e33 100644 --- a/app/logical/media_file/image.rb +++ b/app/logical/media_file/image.rb @@ -7,15 +7,27 @@ class MediaFile::Image < MediaFile JPEG_OPTIONS = { Q: 90, background: 255, strip: true, interlace: true, optimize_coding: true } # http://jcupitt.github.io/libvips/API/current/libvips-resample.html#vips-thumbnail - THUMBNAIL_OPTIONS = { size: :down, linear: false, no_rotate: true } - CROP_OPTIONS = { crop: :attention, linear: false, no_rotate: true } + THUMBNAIL_OPTIONS = { size: :down, linear: false } + CROP_OPTIONS = { crop: :attention, linear: false } def dimensions - image.size + [width, height] rescue Vips::Error [0, 0] end + def width + is_rotated? ? image.height : image.width + rescue Vips::Error + 0 + end + + def height + is_rotated? ? image.width : image.height + rescue Vips::Error + 0 + end + def is_corrupt? image.stats false @@ -69,6 +81,11 @@ class MediaFile::Image < MediaFile file_ext == :png && metadata.fetch("PNG:AnimationFrames", 1) > 1 end + # https://exiftool.org/TagNames/EXIF.html + def is_rotated? + metadata["IFD0:Orientation"].in?(["Rotate 90 CW", "Rotate 270 CW"]) + end + # @return [Vips::Image] the Vips image object for the file def image Vips::Image.new_from_file(file.path, fail: true) diff --git a/app/models/post.rb b/app/models/post.rb index 4b70f75fb..b4d13b9c2 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -1348,6 +1348,20 @@ class Post < ApplicationRecord media_file = MediaFile.open(file, frame_data: pixiv_ugoira_frame_data&.data.to_a) UploadService::Utils.process_resizes(self, nil, id, media_file: media_file) + update!( + image_width: media_file.width, + image_height: media_file.height, + file_size: media_file.file_size, + file_ext: media_file.file_ext, + ) + + media_asset.update!( + image_width: media_file.width, + image_height: media_file.height, + file_size: media_file.file_size, + file_ext: media_file.file_ext, + ) + purge_cached_urls! update_iqdb diff --git a/test/files/test-rotation-180.jpg b/test/files/test-rotation-180.jpg new file mode 100644 index 0000000000000000000000000000000000000000..63cd9c50bce29ae667ade07d01335cee12b55913 GIT binary patch literal 30695 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

vRYzjxxJ=RcbB2k_qeYwl@AwYE>?Yei}87M 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

MPDLB_s^^5ytvkNp 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 Nw_YjJY4QJW0sykEcx3

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 literal 0 HcmV?d00001 diff --git a/test/functional/post_regenerations_controller_test.rb b/test/functional/post_regenerations_controller_test.rb index 75a34670f..443fbe047 100644 --- a/test/functional/post_regenerations_controller_test.rb +++ b/test/functional/post_regenerations_controller_test.rb @@ -58,6 +58,20 @@ class PostRegenerationsControllerTest < ActionDispatch::IntegrationTest assert_equal("post_regenerate", ModAction.last.category) assert_equal("<@#{@mod.name}> regenerated image samples for post ##{@post.id}", ModAction.last.description) end + + should "fix the width and height of exif-rotated images" do + @upload = assert_successful_upload("test/files/test-rotation-90cw.jpg", user: @mod) + @post = @upload.post + + post_auth post_regenerations_path, @mod, params: { post_id: @post.id } + perform_enqueued_jobs + @post.reload + + assert_equal(96, @post.image_width) + assert_equal(128, @post.image_height) + assert_equal(96, @post.media_asset.image_width) + assert_equal(128, @post.media_asset.image_height) + end end end end diff --git a/test/unit/media_file_test.rb b/test/unit/media_file_test.rb index 021df68cb..6d0650332 100644 --- a/test/unit/media_file_test.rb +++ b/test/unit/media_file_test.rb @@ -323,4 +323,40 @@ class MediaFileTest < ActiveSupport::TestCase assert_equal([120, 150], @preview.dimensions) end end + + context "an image that is rotated 90 degrees clockwise" do + should "have the correct dimensions" do + @file = MediaFile.open("test/files/test-rotation-90cw.jpg") + assert_equal([96, 128], @file.dimensions) + end + + should "generate a rotated thumbnail" do + @file = MediaFile.open("test/files/test-rotation-90cw.jpg") + assert_equal([48, 64], @file.preview(64, 64).dimensions) + end + end + + context "an image that is rotated 270 degrees clockwise" do + should "have the correct dimensions" do + @file = MediaFile.open("test/files/test-rotation-270cw.jpg") + assert_equal([100, 66], @file.dimensions) + end + + should "generate a rotated thumbnail" do + @file = MediaFile.open("test/files/test-rotation-270cw.jpg") + assert_equal([50, 33], @file.preview(50, 50).dimensions) + end + end + + context "an image that is rotated 180 degrees" do + should "have the correct dimensions" do + @file = MediaFile.open("test/files/test-rotation-180.jpg") + assert_equal([66, 100], @file.dimensions) + end + + should "generate a rotated thumbnail" do + @file = MediaFile.open("test/files/test-rotation-180.jpg") + assert_equal([33, 50], @file.preview(50, 50).dimensions) + end + end end