From 9c148108810c497ab46aa57c914e5ad16058436d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?KMY=EF=BC=88=E9=9B=AA=E3=81=82=E3=81=99=E3=81=8B=EF=BC=89?= Date: Tue, 21 Jan 2025 12:04:10 +0900 Subject: [PATCH] =?UTF-8?q?Add:=20=E3=82=A2=E3=82=AB=E3=82=A6=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=82=A2=E3=82=A4=E3=82=B3=E3=83=B3=E3=81=A7AVIF?= =?UTF-8?q?=E3=82=92=E3=82=B5=E3=83=9D=E3=83=BC=E3=83=88=20(#962)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/concerns/account/avatar.rb | 8 ++++++-- spec/fixtures/files/avatar.avif | Bin 0 -> 7742 bytes .../examples/models/concerns/account_avatar.rb | 9 +++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 spec/fixtures/files/avatar.avif diff --git a/app/models/concerns/account/avatar.rb b/app/models/concerns/account/avatar.rb index a60a289d5b..f991542f7b 100644 --- a/app/models/concerns/account/avatar.rb +++ b/app/models/concerns/account/avatar.rb @@ -3,7 +3,8 @@ module Account::Avatar extend ActiveSupport::Concern - AVATAR_IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].freeze + AVATAR_IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/heic', 'image/avif', 'image/heif'].freeze + AVATAR_IMAGE_CONVERTIBLE_MIME_TYPES = ['image/heic', 'image/avif', 'image/heif'].freeze AVATAR_LIMIT = Rails.configuration.x.use_vips ? 8.megabytes : 2.megabytes AVATAR_DIMENSIONS = [400, 400].freeze AVATAR_GEOMETRY = [AVATAR_DIMENSIONS.first, AVATAR_DIMENSIONS.last].join('x') @@ -12,6 +13,9 @@ module Account::Avatar def avatar_styles(file) styles = { original: { geometry: "#{AVATAR_GEOMETRY}#", file_geometry_parser: FastGeometryParser } } styles[:static] = { geometry: "#{AVATAR_GEOMETRY}#", format: 'png', convert_options: '-coalesce', file_geometry_parser: FastGeometryParser } if file.content_type == 'image/gif' + + styles[:original] = { format: 'jpeg', content_type: 'image/jpeg' }.merge(styles[:original]) if AVATAR_IMAGE_CONVERTIBLE_MIME_TYPES.include?(file.content_type) + styles end @@ -20,7 +24,7 @@ module Account::Avatar included do # Avatar upload - has_attached_file :avatar, styles: ->(f) { avatar_styles(f) }, convert_options: { all: '+profile "!icc,*" +set date:modify +set date:create +set date:timestamp' }, processors: [:lazy_thumbnail] + has_attached_file :avatar, styles: ->(f) { avatar_styles(f) }, convert_options: { all: '+profile "!icc,*" +set date:modify +set date:create +set date:timestamp' }, processors: [:lazy_thumbnail, :type_corrector] validates_attachment_content_type :avatar, content_type: AVATAR_IMAGE_MIME_TYPES validates_attachment_size :avatar, less_than: AVATAR_LIMIT remotable_attachment :avatar, AVATAR_LIMIT, suppress_errors: false diff --git a/spec/fixtures/files/avatar.avif b/spec/fixtures/files/avatar.avif new file mode 100644 index 0000000000000000000000000000000000000000..f306942dbee737c381c69dbfb69782de3a688b3b GIT binary patch literal 7742 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 bU@I%fNQ74-m26$}I2!49ACq7