Commit 5f543cd9f for imagemagick.org
commit 5f543cd9f95f61f50dd50ef4a8c812586acce083
Author: Dirk Lemstra <dirk@lemstra.org>
Date: Sun Oct 11 21:33:00 2026 +0200
Prefer primary images for HEIC and HEIF still-image brands
diff --git a/coders/heic.c b/coders/heic.c
index 2eeac6b9c..f2cca9107 100644
--- a/coders/heic.c
+++ b/coders/heic.c
@@ -698,6 +698,31 @@ static MagickBooleanType ReadHEICImageHandle(const ImageInfo *image_info,
}
#if LIBHEIF_NUMERIC_VERSION >= HEIC_COMPUTE_NUMERIC_VERSION(1,20,0)
+static MagickBooleanType IsHEICPrimaryImagePreferred(const ImageInfo *image_info,
+ struct heif_context *heif_context,const unsigned char *magic,
+ const size_t length)
+{
+ heif_item_id
+ primary_image_id;
+
+ struct heif_error
+ error;
+
+ uint32_t
+ major_brand;
+
+ if (IsStringTrue(GetImageOption(image_info,"heic:primary-image")) != MagickFalse)
+ return(MagickTrue);
+ major_brand=heif_read_main_brand(magic,length);
+ if ((major_brand != heif_brand2_avif) &&
+ (major_brand != heif_brand2_heic) &&
+ (major_brand != heif_brand2_heix) &&
+ (major_brand != heif_brand2_mif1))
+ return(MagickFalse);
+ error=heif_context_get_primary_image_ID(heif_context,&primary_image_id);
+ return(error.code == heif_error_Ok ? MagickTrue : MagickFalse);
+}
+
static MagickBooleanType GetHEICSequenceTrack(Image *image,
struct heif_context *heif_context,heif_track **sequence_track,
ExceptionInfo *exception)
@@ -1146,10 +1171,10 @@ static Image *ReadHEICImage(const ImageInfo *image_info,ExceptionInfo *exception
}
#if LIBHEIF_NUMERIC_VERSION >= HEIC_COMPUTE_NUMERIC_VERSION(1,20,0)
/*
- Prefer the still image for major brand avif, even if a sequence exists.
+ Prefer an available primary image for still-image major brands.
*/
- if ((primary_image == MagickFalse) &&
- (heif_read_main_brand(magic,sizeof(magic)) != heif_brand2_avif) &&
+ if ((IsHEICPrimaryImagePreferred(image_info,heif_context,magic,
+ sizeof(magic)) == MagickFalse) &&
(heif_context_has_sequence(heif_context) != 0))
{
heif_track