2015-10-08 2 views
3

Я имею в виду это 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:

  1. Запустите приложение.
  2. Нажмите на кнопку, которая запускает таймер, и принимать фотографии на каждые 0,1 сек
  3. Жеребьевка с пальцем (так что все Розыгрыш будет захвачен Эври 0,1 сек)
  4. После каждого снимка, я называю makeanimatedgif метод, так что снимок взят будет добавлен к предыдущему кадру в GIF файл
  5. Остановить все

Выпуск:

- Случай 1:

  1. Нажмите на кнопку (которая действительно создает GIF immediatley)
  2. Начало рисования
  3. Стоп
  4. Проверить 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:

  1. кнопку Hit (запуск таймера, моментальный снимок, вызовите makeGifMethod параллельно с ним)
  2. Draw Somthing
  3. Стоп
  4. Проверить 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?

ответ

4

После нескольких работ я решил сохранить все захваченные изображения в массив и использовать этот массив для передачи изображений в gifMethod. И это так здорово!

Я хранятся все изображения в массив:

-(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(); 

//store all the images into array 
[imgArray adDObject:viewImage]; 

} 

Примечание: убедитесь, что вы изменить размер изображения, прежде чем хранить их в массив еще вы могли бы закончить с предупреждением памяти с последующим крахом приложения, если это используется на более длительный период.

, а затем использовали тот же массив:

-(void)makeAnimatedGif { 
    NSUInteger kFrameCount = imgArray.count; 

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

    NSDictionary *frameProperties = @{ 
             (__bridge id)kCGImagePropertyGIFDictionary: @{ 
               (__bridge id)kCGImagePropertyGIFDelayTime: @0.08f, // a float (not double!) in seconds, rounded to centiseconds in the GIF data 
               } 
             }; 

    NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil]; 
    NSURL *fileURL = [documentsDirectoryURL URLByAppendingPathComponent:@"animated.gif"]; 

    CGImageDestinationRef destination = CGImageDestinationCreateWithURL((__bridge CFURLRef)fileURL, kUTTypeGIF, kFrameCount, NULL); 
    CGImageDestinationSetProperties(destination, (__bridge CFDictionaryRef)fileProperties); 

    for (NSUInteger i = 0; i < kFrameCount; i++) { 
     @autoreleasepool { 
      UIImage *image =[imgArray objectAtIndex:i]; //Here is the change 
      CGImageDestinationAddImage(destination, image.CGImage, (__bridge CFDictionaryRef)frameProperties); 
     } 
    } 

    if (!CGImageDestinationFinalize(destination)) { 
     NSLog(@"failed to finalize image destination"); 
    } 
    CFRelease(destination); 

    NSLog(@"url=%@", fileURL); 

    } 
+1

могли бы вы, возможно, разработать на код, который вы использовали, чтобы решить эту проблему? Вы говорите, что передали массив в gifMethod, но где вы его использовали? –

+0

Можете ли вы прокомментировать фрагменты кода. – iMHitesh

+0

обновил ответ @Hiteshsurani –

Смежные вопросы