Я имею в виду это post. Я пытаюсь сделать gif-файл с изображениями, созданными при скриншоте. Я использую таймер для создания моментального снимка экрана, так что я получаю необходимое количество кадров, которые можно использовать для создания gif. Я делаю снимки каждые 0,1 секунды (позже я остановлю этот таймер через 3 секунды).Создайте gif с UIImages
Вот мой код, чтобы делать снимки моего UIView:
-(void)recordScreen{
self.timer= [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(takeSnapShot) userInfo:nil repeats:YES];
}
-(void)takeSnapShot{
//capture the screenshot of the uiimageview and save it in camera roll
UIGraphicsBeginImageContext(self.drawView.frame.size);
[self.drawView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
и пост я имею в виду, показывает вспомогательную функцию для создания GIF. Я не уверен, как передать свои изображения вспомогательной функции. Вот то, что я пробовал:
Я попытался изменить эту часть:
static NSUInteger kFrameCount = 10;
for (NSUInteger i = 0; i < kFrameCount; i++) {
@autoreleasepool {
UIImage *image = [self takeSnaphot];
CGImageDestinationAddImage(destination, image.CGImage, (__bridge CFDictionaryRef)frameProperties);
}
}
Это создает GIF с 10 кадров моей UIView
.
сейчас ....
То, что я пытаюсь сделать, это:
Я рисую простой рисунок с пальцем на моих UIView
используя UIBeizerPath
и я принимаю снимки параллельно мой рисунок , так что у меня будет около 50-100 файлов PNG. Я пытаюсь передать все эти изображения в makeGifMethod.
WorkFlow:
- Запустите приложение.
- Нажмите на кнопку, которая запускает таймер, и принимать фотографии на каждые 0,1 сек
- Жеребьевка с пальцем (так что все Розыгрыш будет захвачен Эври 0,1 сек)
- После каждого снимка, я называю
makeanimatedgif
метод, так что снимок взят будет добавлен к предыдущему кадру в GIF файл - Остановить все
Выпуск:
- Случай 1:
- Нажмите на кнопку (которая действительно создает GIF immediatley)
- Начало рисования
- Стоп
- Проверить GIF (а GIF с 10 кадров создается с белым фоном, так как Я ничего не нарисовал, когда я нажал кнопку)
Если я вызову метод snapShot в цикле, я получаю последние 10 кадров моего рисунка, но не все.
for (NSUInteger i = 0; i < 10; i++) {
@autoreleasepool {
UIImage *image = [self takeSnapShot];
CGImageDestinationAddImage(destination, image.CGImage, (__bridge CFDictionaryRef)frameProperties);
}
}
- Случай 2:
- кнопку Hit (запуск таймера, моментальный снимок, вызовите makeGifMethod параллельно с ним)
- Draw Somthing
- Стоп
- Проверить GIF (пустой gif создается без каких-либо фреймов, я получаю вызов makeGifMethod каждые 0,1 секунды, не работал должным образом)
Вот код для случая 2:
-(void)recordScreen{
self.timer= [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(takeSnapShot) userInfo:nil repeats:YES];
}
-(void)takeSnapShot{
//capture the screenshot of the uiimageview and save it in camera roll
UIGraphicsBeginImageContext(self.drawView.frame.size);
[self.drawView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self makeAnimatedGif:(UIImage *)viewImage];
});
}
-(void) makeAnimatedGif:(UIImage *)image{
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
}
};
documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil];
fileURL = [documentsDirectoryURL URLByAppendingPathComponent:@"animated.gif"];
CGImageDestinationRef destination = CGImageDestinationCreateWithURL((__bridge CFURLRef)fileURL, kUTTypeGIF, 10, NULL);
CGImageDestinationSetProperties(destination, (__bridge CFDictionaryRef)fileProperties);
CGImageDestinationAddImage(destination, image.CGImage, (__bridge CFDictionaryRef)frameProperties);
if (!CGImageDestinationFinalize(destination)) {
NSLog(@"failed to finalize image destination");
}
CFRelease(destination);
NSLog(@"url=%@", fileURL);
}
Может кто-то пожалуйста, предложите мне, как передать захваченные изображения с описанным выше способом, чтобы сделать GIF?
могли бы вы, возможно, разработать на код, который вы использовали, чтобы решить эту проблему? Вы говорите, что передали массив в gifMethod, но где вы его использовали? –
Можете ли вы прокомментировать фрагменты кода. – iMHitesh
обновил ответ @Hiteshsurani –