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
|
module Account::Avatar
|
||||||
extend ActiveSupport::Concern
|
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_LIMIT = Rails.configuration.x.use_vips ? 8.megabytes : 2.megabytes
|
||||||
AVATAR_DIMENSIONS = [400, 400].freeze
|
AVATAR_DIMENSIONS = [400, 400].freeze
|
||||||
AVATAR_GEOMETRY = [AVATAR_DIMENSIONS.first, AVATAR_DIMENSIONS.last].join('x')
|
AVATAR_GEOMETRY = [AVATAR_DIMENSIONS.first, AVATAR_DIMENSIONS.last].join('x')
|
||||||
|
@ -12,6 +13,9 @@ module Account::Avatar
|
||||||
def avatar_styles(file)
|
def avatar_styles(file)
|
||||||
styles = { original: { geometry: "#{AVATAR_GEOMETRY}#", file_geometry_parser: FastGeometryParser } }
|
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[: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
|
styles
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -20,7 +24,7 @@ module Account::Avatar
|
||||||
|
|
||||||
included do
|
included do
|
||||||
# Avatar upload
|
# 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_content_type :avatar, content_type: AVATAR_IMAGE_MIME_TYPES
|
||||||
validates_attachment_size :avatar, less_than: AVATAR_LIMIT
|
validates_attachment_size :avatar, less_than: AVATAR_LIMIT
|
||||||
remotable_attachment :avatar, AVATAR_LIMIT, suppress_errors: false
|
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
|
||||||
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
|
describe 'base64-encoded files', :attachment_processing do
|
||||||
let(:base64_attachment) { "data:image/jpeg;base64,#{Base64.encode64(attachment_fixture('attachment.jpg').read)}" }
|
let(:base64_attachment) { "data:image/jpeg;base64,#{Base64.encode64(attachment_fixture('attachment.jpg').read)}" }
|
||||||
let(:account) { Fabricate(fabricator, avatar: base64_attachment) }
|
let(:account) { Fabricate(fabricator, avatar: base64_attachment) }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue