Add: アカウントアイコンでAVIFをサポート (#962)

This commit is contained in:
KMY(雪あすか) 2025-01-21 12:04:10 +09:00 committed by GitHub
parent ecb9bbecac
commit 9c14810881
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 15 additions and 2 deletions

View file

@ -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

BIN
spec/fixtures/files/avatar.avif vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View file

@ -24,6 +24,15 @@ RSpec.shared_examples 'AccountAvatar' do |fabricator|
end
end
describe 'convertable avatars', :attachment_processing do
describe 'with AVIF' do
it 'creates a jpeg static style' do
account = Fabricate(fabricator, avatar: attachment_fixture('avatar.avif'))
expect(account.avatar_original_url.end_with?('.jpeg')).to be true
end
end
end
describe 'base64-encoded files', :attachment_processing do
let(:base64_attachment) { "data:image/jpeg;base64,#{Base64.encode64(attachment_fixture('attachment.jpg').read)}" }
let(:account) { Fabricate(fabricator, avatar: base64_attachment) }