Add: アカウントアイコンでAVIFをサポート (#962)
This commit is contained in:
parent
ecb9bbecac
commit
9c14810881
3 changed files with 15 additions and 2 deletions
|
@ -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
BIN
spec/fixtures/files/avatar.avif
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.6 KiB |
|
@ -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) }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue