2017-11-26 16 views
0

私は次の方法でgifを生成しています。生成されたGIFが大きすぎます - ObjectiveC

-(void)makeAnimatedGif:(NSArray *)imgArray { 
    __block NSString *fileName = [NSString stringWithFormat:@"%ld",(long)[[NSDate date] timeIntervalSince1970]]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     //Do background work 
     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.02f, // 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:fileName]; 

     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 
       if (image.CGImage) { 
        CGImageDestinationAddImage(destination, image.CGImage, (__bridge CFDictionaryRef)frameProperties); 
       } 
      } 
     } 

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

     dispatch_async(dispatch_get_main_queue(), ^{ 
      //Update UI 
      CFRelease(destination); 
      [self manageGifWithUrl:fileURL]; 
     }); 
    }); 

} 

私のgifの問題は、サイズが非常に大きいことです。生成されるgifのサイズは40MB〜90MBです。私はこれのための解決策を見つけることができません。

私のimgArrayには180個の画像が含まれています。これに修正がありますか?

答えて

0

ビデオを作成する場合は、ビデオをエンコードします。アニメーションGIFはアニメーションのようなビデオをカプセル化するのにひどいものです。すべてのブラウザがそれらをレンダリングできるので、それらは非常に一般的になりました。あなたの目標がクロスプラットフォームの共通分母でない限り、アニメーションGIFは使用しないでください。

40-80MBはそれほど驚くことではありません。サイズを小さくするには、単純に小さくするか、カラーパレットを縮小して圧縮して入力画像の解像度を下げます。

+0

あなたは同じことをするためのリンクやリソースを提供できますか?それは本当に役立つだろう。 – Dalvik

+0

残念ながら、実際にビデオをエンコードすることは、私が多くの経験を持っていることではありません(私は何年前にGIF89aデコーダーを書きました。私はあなたが少しの調査をしたら、新しいSOの質問を提案します。 – bbum

関連する問題