推特上分享的GIF图片无法动画播放

7
我正在使用NSArrayUIImage创建动画GIF文件,并将其保存在iPhone的NSDocumentDirectory以及照片相册中。
我遇到的问题是,当我在电子邮件合成器或iMessage中打开保存的GIF时,它会正常播放动画。但是当我通过Twitter分享它时,它不会动画。我尝试通过iPhone上的Twitter应用程序进行共享,并看到一个有趣的事情(如下屏幕截图),使用Safari从不同网站下载的GIF显示了一个标签“ GIF”,而我的保存的GIF则没有。这里可能出了什么问题?请问有人可以指导我吗?
以下是创建GIF文件的代码:
float delay = 1.0/15.0; // 15 FPS

NSDictionary *prep = @{
                       (__bridge id)kCGImagePropertyGIFDictionary: @{
                               (__bridge id)kCGImagePropertyGIFDelayTime: @(delay) 
                               }
                       };

//    static NSUInteger kFrameCount = 16;

NSDictionary *fileProperties = @{
                                 (__bridge id)kCGImagePropertyGIFDictionary: @{
                                         (__bridge id)kCGImagePropertyGIFLoopCount: @0 // 0 means loop forever
                                         }
                                 };

CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:path];

CGImageDestinationRef dst = CGImageDestinationCreateWithURL(url, kUTTypeGIF, [images count], nil);
CGImageDestinationSetProperties(dst, (__bridge CFDictionaryRef)fileProperties);

for (int i=0;i<[images count];i++)
{
        //load anImage from array
        UIImage * anImage = [images objectAtIndex:i];

        CGImageDestinationAddImage(dst, anImage.CGImage,(__bridge CFDictionaryRef)prep);

}

bool fileSave = CGImageDestinationFinalize(dst);
CFRelease(dst);
if(fileSave) {
    NSLog(@"animated GIF file created at %@", path);
}else{
    NSLog(@"error: no animated GIF file created at %@", path);
}

将GIF保存到相册以及NSDocumentDirectory。要保存到iPhone的相册中,这里是代码:

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

NSData *data = [NSData dataWithContentsOfFile:tempPath];

[library writeImageDataToSavedPhotosAlbum:data metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
    if (error) {
        NSLog(@"Error Saving GIF to Photo Album: %@", error);
    } else {
        // TODO: success handling
        NSLog(@"GIF Saved to %@", assetURL);

        success(tempPath);
    }
}];

HJImagesToGIF是个很好的帮助,还有这份代码片段

更新:

通过分析两个 GIF 的图像头: 1- 图像头:GIF89a - 通过 Safari 下载,Twitter 应用中显示 GIF 标签 2- 图像头:GIF87a - 通过代码创建,Twitter 应用中不显示 GIF 标签

所以,图像头怎么改呢?


请问您能否描述一下这个是如何工作的,我遇到了同样的问题。 - Dipen Chudasama
1个回答

7

好的,问题已经解决了,我不确定这是否是最佳解决方案,如果有更好的解决方案,欢迎提供!

问题确实与我通过代码创建的GIF图像头有关。

我复制了一个GIF89a头GIF的头部(前6个字节),然后用它替换了我的GIF图像头。现在在Twitter、电子邮件和iMessage上都能正常工作。

以下是我使用的代码:

NSMutableData *gifData = [NSMutableData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"1.gif" ofType:nil]]; // GIF89a file
NSMutableData *data = [NSMutableData dataWithContentsOfFile:path]; // My created GIF file 
NSMutableData *gif89 = [NSMutableData dataWithData:[gifData subdataWithRange:NSMakeRange(0, 6)]]; // the first 6 bytes we needed (or the Header)
[data replaceBytesInRange:NSMakeRange(0, 6) withBytes:gif89.bytes]; // replace the header.. Voila! 

更新了我的回答,并附上了代码示例。 - Haris Hussain
1
所以我尝试了这个:我将gif发送到我的电子邮件。然后在我的Mac上下载并尝试通过Tweetbot发布它,它是动画的(Web客户端也是如此)。通过UIActivityViewController共享的相同图像-> Twitter,不会动画。 - haawa
现在FB允许GIF图片,但有一个问题,如果您直接上传图片或与FB库共享,则不会动画,但是当您发布其URL时,它会动画。这很奇怪。 - Adeel
这是一个绝妙的黑客技巧!顺便提一句,头部只是ASCII数据。比如对于GIF89a来说,头部正好是那个"GIF89a"字符串。 - GeneCode
这很有趣,我应该使用ASCII而不是数据工作!谢谢@Rocotilos - Haris Hussain
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接