我在iOS应用程序中有一系列用户自定义图像,这些图像以简单的逐帧翻转书样式进行动画处理。
我的问题是:有没有办法允许用户将其动画导出为动画gif?理想情况下,我希望使他们能够通过电子邮件发送电子邮件,社交共享(T /
FB)或(最坏的情况。)将动画gif保存到他们的文档文件夹中,以便通过iTunes进行检索。
我知道如何将.png保存到图片库,并且找到了一种将动画录制为QT文件的方法(http://www.cimgf.com/2009/02/03/record-
your-core-animation -animation /
),但我还没有找到一种方法来踢出普通的老式gif动画。我在核心动画或其他地方缺少什么吗?有没有人可以推荐的方法,框架或资源?很抱歉,这个问题过于笼统-
努力寻找起点。
您可以使用Image I / O框架(iOS
SDK的一部分)创建动画GIF。您还将需要包括MobileCoreServices
定义GIF类型常量的框架。您需要将这些框架添加到目标中,并将它们的标头导入要创建动画GIF的文件中,如下所示:
#import <ImageIO/ImageIO.h>
#import <MobileCoreServices/MobileCoreServices.h>
通过示例最容易解释。我将向您展示我在iPhone 5上制作此GIF的代码:
首先,这是一个帮助函数,该函数采用大小和角度,并以该角度返回UIImage
红色磁盘的a :
static UIImage *frameImage(CGSize size, CGFloat radians) {
UIGraphicsBeginImageContextWithOptions(size, YES, 1); {
[[UIColor whiteColor] setFill];
UIRectFill(CGRectInfinite);
CGContextRef gc = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(gc, size.width / 2, size.height / 2);
CGContextRotateCTM(gc, radians);
CGContextTranslateCTM(gc, size.width / 4, 0);
[[UIColor redColor] setFill];
CGFloat w = size.width / 10;
CGContextFillEllipseInRect(gc, CGRectMake(-w / 2, -w / 2, w, w));
}
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
现在我们可以创建GIF。首先,我们将为帧数定义一个常量,因为以后需要它两次:
static void makeAnimatedGif(void) {
static NSUInteger const kFrameCount = 16;
我们需要一个属性字典来指定动画应重复的次数:
NSDictionary *fileProperties = @{
(__bridge id)kCGImagePropertyGIFDictionary: @{
(__bridge id)kCGImagePropertyGIFLoopCount: @0, // 0 means loop forever
}
};
我们将需要另一个属性字典,该字典将附加到每个框架上,指定该框架应显示多长时间:
NSDictionary *frameProperties = @{
(__bridge id)kCGImagePropertyGIFDictionary: @{
(__bridge id)kCGImagePropertyGIFDelayTime: @0.02f, // a float (not double!) in seconds, rounded to centiseconds in the GIF data
}
};
我们还将在文档目录中为GIF创建URL:
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil];
NSURL *fileURL = [documentsDirectoryURL URLByAppendingPathComponent:@"animated.gif"];
现在,我们可以创建一个CGImageDestination
将GIF写入指定URL的:
CGImageDestinationRef destination = CGImageDestinationCreateWithURL((__bridge CFURLRef)fileURL, kUTTypeGIF, kFrameCount, NULL);
CGImageDestinationSetProperties(destination, (__bridge CFDictionaryRef)fileProperties);
我发现,通过fileProperties
作为最后一个参数CGImageDestinationCreateWithURL
确实 没有
工作。您必须使用CGImageDestinationSetProperties
。
现在我们可以创建和编写框架:
for (NSUInteger i = 0; i < kFrameCount; i++) {
@autoreleasepool {
UIImage *image = frameImage(CGSizeMake(300, 300), M_PI * 2 * i / kFrameCount);
CGImageDestinationAddImage(destination, image.CGImage, (__bridge CFDictionaryRef)frameProperties);
}
}
请注意,我们将帧属性字典与每个帧图像一起传递。
精确添加指定数量的帧后,我们最终确定目标并释放它:
if (!CGImageDestinationFinalize(destination)) {
NSLog(@"failed to finalize image destination");
}
CFRelease(destination);
NSLog(@"url=%@", fileURL);
}
如果在模拟器上运行它,则可以从调试控制台复制URL,然后将其粘贴到浏览器中以查看图像。如果在设备上运行它,则可以使用Xcode
Organizer窗口从设备下载应用程序沙箱并查看图像。或者,您可以使用类似的应用程序iExplorer
来直接浏览设备的文件系统。(这不需要越狱。)
我在运行iOS 6.1的iPhone 5上进行了测试,但是我认为代码应该可以追溯到iOS 4.0。
为了方便复制,我将所有代码都放在了要点中。
问题内容: 是否有人设法说服ImageIO编写动画GIF,尤其是设置正确的元数据?我的第一次尝试大致如下(其中b1和b2是BufferedImages): 这似乎几乎可以工作,但是: 我显然需要以某种方式设置“适当的”元数据来设置图像之间的时间,并理想地使它们循环(我天真地希望默认设置会做一些明智的事情,但嘿…) 它默认情况下写入的任何元数据显然都不是正确的:GIMP在加载文件时会给出一些错误消息
1.4. GIF动画 下面的程序会演示Go语言标准库里的image这个package的用法,我们会用这个包来生成一系列的bit-mapped图,然后将这些图片编码为一个GIF动画。我们生成的图形名字叫利萨如图形(Lissajous figures),这种效果是在1960年代的老电影里出现的一种视觉特效。它们是协振子在两个纬度上振动所产生的曲线,比如两个sin正弦波分别在x轴和y轴输入会产生的曲线。
关于 Flash 图形 Flash (SWF) 文件格式是一种基于矢量的图形文件格式,它用于适合 Web 的可缩放小尺寸图形。由于这种文件格式基于矢量,因此,图稿可以在任何分辨率下保持其图像品质,并且非常适于创建动画帧。在 Illustrator 中,可以在图层上创建单独的动画帧,然后将图像图层导出到网站上使用的单独帧中。也可以在 Illustrator 文件中定义符号以减小动画的大小。在导出后,
你好,飞越花的伙伴们, 简要概述我正在努力实现的目标;我有一个网站,它将接受视频上传,上传会被转换成mp4格式,以便统一穿着,并使用众多可用播放器之一在网络上播放。那部分很好,很漂亮。 现在的问题是,我想在用户点击播放视频之前,向他们显示视频的简短预览(动画gif)。我现在使用的代码是 它适用于以每秒1帧的速度创建一个固定宽度为150像素的缩放动画gif,但它只是视频前10秒的动画。我正在尝试做一
问题内容: 我想在应用程序中显示GIF动画图像。我发现,Android本身并不支持动画GIF的困难方式。 但是,它可以使用AnimationDrawable显示动画: 开发>指南>图像和图形> Drawables概述 该示例使用在应用程序资源中另存为帧的动画,但是我需要直接显示动画gif。 我的计划是将动画GIF分解为帧,并将每个帧作为可绘制对象添加到AnimationDrawable中。 有谁知
我有一个NSButton,它的底部与superview的齐平,我想设置它向上移动的动画,使其顶部与superview的齐平。 WWDC 2012课程228:掌握自动布局的最佳实践提到了两种设置布局更改动画的方法(31:16),我正在尝试使用CoreAnimation技术。下面的示例确实正确地移动了NSButton,但它是即时移动的,没有动画。 我能补充一下吗