diff --git a/SDWebImage/Core/SDImageHEICCoder.m b/SDWebImage/Core/SDImageHEICCoder.m index dd83aea1..abca4e64 100644 --- a/SDWebImage/Core/SDImageHEICCoder.m +++ b/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 { diff --git a/SDWebImage/Core/SDImageIOAnimatedCoder.m b/SDWebImage/Core/SDImageIOAnimatedCoder.m index b529efbc..cb05e395 100644 --- a/SDWebImage/Core/SDImageIOAnimatedCoder.m +++ b/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]; }