Fix our HEIC coder to encode `timed image sequences` instead of `non-timed image gallery` for HEIC encoding
Also, some little behavior changes, the `format` arg in animated coder does not help for anything.
This commit is contained in:
parent
be0bcd7823
commit
11dc8e88d5
|
@ -75,7 +75,11 @@ static NSString * kSDCGImagePropertyHEICSUnclampedDelayTime = @"UnclampedDelayTi
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSString *)imageUTType {
|
+ (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 {
|
+ (NSString *)dictionaryProperty {
|
||||||
|
|
|
@ -832,11 +832,11 @@ static BOOL SDImageIOPNGPluginBuggyNeedWorkaround(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
NSMutableData *imageData = [NSMutableData data];
|
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
|
// 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.
|
// 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) {
|
if (!imageDestination) {
|
||||||
// Handle failure.
|
// Handle failure.
|
||||||
return nil;
|
return nil;
|
||||||
|
@ -922,6 +922,11 @@ static BOOL SDImageIOPNGPluginBuggyNeedWorkaround(void) {
|
||||||
|
|
||||||
CFRelease(imageDestination);
|
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];
|
return [imageData copy];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue