Sie können ein animiertes GIF mit dem Image I / O-Framework (das Teil des iOS SDK ist) erstellen. Sie möchten auch das MobileCoreServices
Framework einschließen , das die GIF-Typkonstante definiert. Sie müssen diese Frameworks zu Ihrem Ziel hinzufügen und ihre Header in die Datei importieren, in der Sie das animierte GIF erstellen möchten.
#import <ImageIO/ImageIO.h>
#import <MobileCoreServices/MobileCoreServices.h>
Es ist am einfachsten, dies anhand eines Beispiels zu erklären. Ich zeige Ihnen den Code, mit dem ich dieses GIF auf meinem iPhone 5 erstellt habe:
Hier ist zunächst eine Hilfsfunktion, die eine Größe und einen Winkel annimmt und eine UIImage
der roten Scheiben in diesem Winkel zurückgibt :
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;
}
Jetzt können wir das GIF erstellen. Zuerst definieren wir eine Konstante für die Anzahl der Frames, da wir sie später zweimal benötigen:
static void makeAnimatedGif(void) {
static NSUInteger const kFrameCount = 16;
Wir benötigen ein Eigenschaftswörterbuch, um anzugeben, wie oft die Animation wiederholt werden soll:
NSDictionary *fileProperties = @{
(__bridge id)kCGImagePropertyGIFDictionary: @{
(__bridge id)kCGImagePropertyGIFLoopCount: @0,
}
};
Und wir benötigen ein weiteres Eigenschaftswörterbuch, das wir jedem Frame anhängen und angeben, wie lange dieser Frame angezeigt werden soll:
NSDictionary *frameProperties = @{
(__bridge id)kCGImagePropertyGIFDictionary: @{
(__bridge id)kCGImagePropertyGIFDelayTime: @0.02f,
}
};
Wir erstellen auch eine URL für das GIF in unserem Dokumentenverzeichnis:
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil];
NSURL *fileURL = [documentsDirectoryURL URLByAppendingPathComponent:@"animated.gif"];
Jetzt können wir ein erstellen CGImageDestination
, das ein GIF an die angegebene URL schreibt:
CGImageDestinationRef destination = CGImageDestinationCreateWithURL((__bridge CFURLRef)fileURL, kUTTypeGIF, kFrameCount, NULL)
CGImageDestinationSetProperties(destination, (__bridge CFDictionaryRef)fileProperties)
Ich entdeckte , dass Passieren fileProperties
der als letztes Argument CGImageDestinationCreateWithURL
tut nicht Arbeit. Du musst benutzen CGImageDestinationSetProperties
.
Jetzt können wir unsere Frames erstellen und schreiben:
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);
}
}
Beachten Sie, dass wir das Frame-Eigenschaften-Wörterbuch zusammen mit jedem Frame-Bild übergeben.
Nachdem wir genau die angegebene Anzahl von Frames hinzugefügt haben, finalisieren wir das Ziel und geben es frei:
if (!CGImageDestinationFinalize(destination)) {
NSLog(@"failed to finalize image destination");
}
CFRelease(destination);
NSLog(@"url=%@", fileURL);
}
Wenn Sie dies auf dem Simulator ausführen, können Sie die URL von der Debug-Konsole kopieren und in Ihren Browser einfügen, um das Bild anzuzeigen. Wenn Sie es auf dem Gerät ausführen, können Sie im Xcode Organizer-Fenster die App-Sandbox vom Gerät herunterladen und das Bild anzeigen. Oder Sie können eine solche App verwenden iExplorer
, mit der Sie das Dateisystem Ihres Geräts direkt durchsuchen können. (Dies erfordert kein Jailbreaking.)
Ich habe dies auf meinem iPhone 5 mit iOS 6.1 getestet, aber ich glaube, der Code sollte bereits unter iOS 4.0 funktionieren.
Ich habe den gesamten Code zum einfachen Kopieren in diese Liste aufgenommen .
Für Swift 3
import Foundation import UIKit import ImageIO import MobileCoreServices extension UIImage { static func animatedGif(from images: [UIImage]) { let fileProperties: CFDictionary = [kCGImagePropertyGIFDictionary as String: [kCGImagePropertyGIFLoopCount as String: 0]] as CFDictionary let frameProperties: CFDictionary = [kCGImagePropertyGIFDictionary as String: [(kCGImagePropertyGIFDelayTime as String): 1.0]] as CFDictionary let documentsDirectoryURL: URL? = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) let fileURL: URL? = documentsDirectoryURL?.appendingPathComponent("animated.gif") if let url = fileURL as CFURL? { if let destination = CGImageDestinationCreateWithURL(url, kUTTypeGIF, images.count, nil) { CGImageDestinationSetProperties(destination, fileProperties) for image in images { if let cgImage = image.cgImage { CGImageDestinationAddImage(destination, cgImage, frameProperties) } } if !CGImageDestinationFinalize(destination) { print("Failed to finalize the image destination") } print("Url = \(fileURL)") } } } }
Ich habe es aus der obigen Antwort konvertiert . Ich hoffe, es hilft.
Verfügbar als Kern .
Änderungen sind willkommen.
quelle
Array
whereElement == UIImage
.Wenn Sie nach einer Swift 3-Lösung suchen, können Sie sich https://github.com/onmyway133/GifMagic ansehen . Es hat
Encoder
undDecoder
welche GIF-Datei zusammenbaut und zerlegt.Grundsätzlich sollten Sie verwenden
Image IO
Rahmen mit diesen FunktionenCGImageDestinationCreateWithURL
,CGImageDestinationSetProperties
,CGImageDestinationAddImage
,CGImageDestinationFinalize
Auch mit Swift https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html
quelle