Procházet zdrojové kódy

Merge pull request #3727 from dreampiggy/bugfix/heics_animated_encoding

Fix our HEIC coder to encode `timed image sequences` instead of `non-timed image gallery` for HEIC encoding
DreamPiggy před 1 rokem
rodič
revize
cba8ec9667

+ 5 - 1
SDWebImage/Core/SDImageHEICCoder.m

@@ -75,7 +75,11 @@ static NSString * kSDCGImagePropertyHEICSUnclampedDelayTime = @"UnclampedDelayTi
 }
 
 + (NSString *)imageUTType {
-    return (__bridge NSString *)kSDUTTypeHEIC;
+    // See: https://nokiatech.github.io/heif/technical.html
+    // Actually HEIC has another concept called `non-timed Image Sequence`, which can be encoded using `public.heic`
+    // But current SDWebImage does not has this design, I don't know whether there are use case for this
+    // So we just replace and always use `timed Image Sequence`, means, animated image for encoding
+    return (__bridge NSString *)kSDUTTypeHEICS;
 }
 
 + (NSString *)dictionaryProperty {

+ 7 - 2
SDWebImage/Core/SDImageIOAnimatedCoder.m

@@ -832,11 +832,11 @@ static BOOL SDImageIOPNGPluginBuggyNeedWorkaround(void) {
     }
     
     NSMutableData *imageData = [NSMutableData data];
-    CFStringRef imageUTType = [NSData sd_UTTypeFromImageFormat:format];
+    NSString *imageUTType = self.class.imageUTType;
     
     // Create an image destination. Animated Image does not support EXIF image orientation TODO
     // The `CGImageDestinationCreateWithData` will log a warning when count is 0, use 1 instead.
-    CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, imageUTType, frames.count ?: 1, NULL);
+    CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, (__bridge CFStringRef)imageUTType, frames.count ?: 1, NULL);
     if (!imageDestination) {
         // Handle failure.
         return nil;
@@ -922,6 +922,11 @@ static BOOL SDImageIOPNGPluginBuggyNeedWorkaround(void) {
     
     CFRelease(imageDestination);
     
+    // In some beta version, ImageIO `CGImageDestinationFinalize` returns success, but the data buffer is 0 bytes length.
+    if (imageData.length == 0) {
+        return nil;
+    }
+    
     return [imageData copy];
 }