uploads: add support for uploading .avif files.
Features of AVIF include: * Lossless and lossy compression. * High dynamic range (HDR) images * Wide color gamut images (i.e. 10- and 12-bit color depths) * Transparency (through alpha planes). * Animations (with an optional cover image). * Auxiliary image sequences, where the file contains a single primary image and a short secondary video, like Apple's Live Photos. * Metadata rotation, mirroring, and cropping. The AVIF format is still relatively new and some of these features aren't well supported by browsers or other software: * Animated AVIFs aren't supported by Firefox or by libvips. * HDR images aren't supported by Firefox. * Rotated, mirrored, and cropped AVIFs aren't supported by Firefox or Chrome. * Image grids, where the file contains multiple images that are tiled together into one big image, aren't supported by Firefox. * AVIF as a whole has only been supported for a year or two by Chrome and Firefox, and less than a year by Safari. For these reasons, only basic AVIFs that don't use animation, rotation, cropping, or image grids can be uploaded.
This commit is contained in:
@@ -11,6 +11,16 @@ class MediaFile::Image < MediaFile
|
||||
[0, 0]
|
||||
end
|
||||
|
||||
def is_supported?
|
||||
case file_ext
|
||||
when :avif
|
||||
# XXX Mirrored AVIFs should be unsupported too, but we currently can't detect the mirrored flag using exiftool or ffprobe.
|
||||
!metadata.is_rotated? && !metadata.is_cropped? && !metadata.is_grid_image? && !metadata.is_animated_avif?
|
||||
else
|
||||
true
|
||||
end
|
||||
end
|
||||
|
||||
def is_corrupt?
|
||||
image.stats
|
||||
false
|
||||
@@ -28,6 +38,8 @@ class MediaFile::Image < MediaFile
|
||||
image.get("n-pages")
|
||||
elsif file_ext == :png
|
||||
metadata.fetch("PNG:AnimationFrames", 1)
|
||||
elsif file_ext == :avif
|
||||
video.frame_count
|
||||
else
|
||||
nil
|
||||
end
|
||||
@@ -112,6 +124,10 @@ class MediaFile::Image < MediaFile
|
||||
file_ext == :png && is_animated?
|
||||
end
|
||||
|
||||
def is_animated_avif?
|
||||
file_ext == :avif && is_animated?
|
||||
end
|
||||
|
||||
# Return true if the image has an embedded ICC color profile.
|
||||
def has_embedded_profile?
|
||||
image.icc_import(embedded: true)
|
||||
|
||||
Reference in New Issue
Block a user