史上最簡單的GIF制作(錄屏)---一行代碼搞定(OC)

之前無意間看到優(yōu)酷視頻有個GIF截取的功能明棍,感覺相當炫酷排作,于是自己就想著有空搞一個牵啦,前一陣子抽空查資料發(fā)現(xiàn)OC原生的有相關的方法,就整理了下妄痪,然后又忘了分享出來,這不楞件,又看到了衫生,所以這次還是po出來,讓大家看看土浸,相互進步吧罪针。

我叫杜甫,我很忙.png

先把調(diào)用的那行代碼拿出來黄伊,讓大家看的省心點(免得說樓主騙人泪酱,說好的一行代碼,吧嗒吧嗒這么久还最?)

示例--已經(jīng)是錄好的gif

//   web就是要錄制gif的view
    [screenShotToll RecordScreenInView:web During:5 gifPath:^(NSString *gifsPath) {
        
//        獲取到gif保存的地址墓阀,可以顯示可以儲存
        NSLog(@"%@",gifsPath);
//        顯示
        UIWebView *webs = [[UIWebView alloc] init];
        webs.frame = CGRectMake(0, sheight / 2,swidth, sheight / 2);
        [self.view addSubview:webs];
        NSData *gifData = [NSData dataWithContentsOfFile:gifsPath];
        [webs loadData:gifData MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
//        儲存
        NSData *data = [NSData dataWithContentsOfFile:gifsPath];
//         保存到本地相冊  ALAssetsLibrary需要導入頭文件
        ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
        [library writeImageDataToSavedPhotosAlbum:data metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
            NSLog(@"Success at %@", [assetURL path] );
        }] ;
    }];
首先,乍一聽軟件錄屏(GIF制作)好像特別高大上拓轻,感覺無從下手斯撮,分析開來,gif都是由一幀一幀的圖片組合而成扶叉,經(jīng)過多張圖片的處理最后形成新的文件格式.gif勿锅。那么單張圖片怎么獲取呢?答案很簡單枣氧,原生代碼擼幾行就好了溢十,如下:返回的就是屏幕截圖或者可以是屏幕內(nèi)任意view的截圖
+ (UIImage *)shotInView:(UIView *)view
{
    UIGraphicsBeginImageContext(view.bounds.size);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

接下來就要獲取到錄屏時間內(nèi)的所有截圖用于制作gif
- (void)writeImageToHD:(NSInteger)time inView:(UIView *)view writeOk:(void (^)(BOOL isOK))writeOK
{
//    創(chuàng)建gif圖的文件保存目錄
    __block NSString *imagePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    imagePath = [imagePath stringByAppendingPathComponent:@"gif"];
    [[screenShotToll shareInstance].manager createDirectoryAtPath:imagePath withIntermediateDirectories:YES attributes:nil error:nil];
    __block int i = 1;
//    為即將保存的圖片設置圖片名稱
    __block NSString *imagePS = [imagePath stringByAppendingString:[NSString stringWithFormat:@"/image-%d.png",i]];
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:.1 repeats:YES block:^(NSTimer * _Nonnull timer) {
//        將定時器時間內(nèi)每隔.1(截圖頻率,自己可以控制)的屏幕截圖儲存起來达吞,保存成功后進行下一張存放
        if ([UIImagePNGRepresentation([screenShotToll shotInView:view]) writeToFile:imagePS atomically:YES] && i  < (time / .1)) {
            i ++;
            imagePS = [imagePath stringByAppendingString:[NSString stringWithFormat:@"/image-%d.png",i]];
        }else{
//            屏幕截圖完成后返回YES张弛,圖片數(shù)量 = time / 截圖頻率
            [timer invalidate];
            timer = nil;
            writeOK(YES);
        }
    }];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
}

最后就是重頭戲,將上述截圖完成的圖片們組合成一個完整的GIF
+ (void)RecordScreenInView:(UIView *)view During:(NSInteger)time gifPath:(void (^)(NSString *gifsPath))gifsPath
{
    
    [[screenShotToll shareInstance] writeImageToHD:time inView:view writeOk:^(BOOL isOK) {
        if (isOK) {
            NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
            path = [path stringByAppendingPathComponent:@"/gif"];
//            創(chuàng)建數(shù)組保存所有圖片
            NSMutableArray *images = [NSMutableArray array];
            for (int j = 1; j < time / .1; j ++) {
                UIImage *image = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/image-%d.png",path,j]];
                if (image) {
                    [images addObject:image];
                }
            }
            CGImageDestinationRef destination;
            NSString *doucument = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//            設置gif圖的儲存地址
            NSString *gif = [doucument stringByAppendingPathComponent:@"gif"];
            [[screenShotToll shareInstance].manager createDirectoryAtPath:gif withIntermediateDirectories:YES attributes:nil error:nil];
//            獲取gif的儲存地址 --- 再往下的是我在網(wǎng)上扒了好久扒到的
            NSString *gifPath = [gif stringByAppendingPathComponent:@"image.gif"];
            CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)gifPath, kCFURLPOSIXPathStyle, false);
            destination = CGImageDestinationCreateWithURL(url,kUTTypeGIF, images.count, NULL);
//            接下來配置制作gif時的一些屬性
            NSDictionary *framePro = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:.5],(NSString *)kCGImagePropertyGIFDelayTime, nil] forKey:(NSString *)kCGImagePropertyGIFDictionary];
            NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:2];
            [dict setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCGImagePropertyGIFHasGlobalColorMap];
            [dict setObject:[NSNumber numberWithInt:8] forKey:(NSString *)kCGImagePropertyDepth];
            [dict setObject:(NSString *)kCGImagePropertyGIFImageColorMap forKey:(NSString *)kCGImagePropertyColorModel];
            [dict setObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount];
            
//            遍歷截圖數(shù)組,制作gif圖
            NSDictionary *gifPro = [NSDictionary dictionaryWithObject:dict forKey:(NSString *)kCGImagePropertyGIFDictionary];
            for (UIImage *image in images) {
                CGImageDestinationAddImage(destination, image.CGImage, (__bridge CFDictionaryRef)framePro);
            }
            CGImageDestinationSetProperties(destination, (__bridge CFDictionaryRef)gifPro);
            CGImageDestinationFinalize(destination);
            CFRelease(destination);
            
            gifsPath(gifPath);
        }
    }];
}

好了留下demo乌庶,覺得好的可以給星爸值!謝謝大家支持

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞒大,一起剝皮案震驚了整個濱河市螃征,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌透敌,老刑警劉巖盯滚,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酗电,居然都是意外死亡魄藕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門撵术,熙熙樓的掌柜王于貴愁眉苦臉地迎上來背率,“玉大人,你說我怎么就攤上這事嫩与∏拮耍” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵划滋,是天一觀的道長饵筑。 經(jīng)常有香客問我,道長处坪,這世上最難降的妖魔是什么根资? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮同窘,結果婚禮上玄帕,老公的妹妹穿的比我還像新娘。我一直安慰自己塞椎,他們只是感情好桨仿,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著案狠,像睡著了一般服傍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骂铁,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天吹零,我揣著相機與錄音,去河邊找鬼拉庵。 笑死灿椅,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茫蛹,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼操刀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了婴洼?” 一聲冷哼從身側(cè)響起骨坑,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柬采,沒想到半個月后欢唾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡粉捻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年礁遣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肩刃。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡祟霍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出树酪,到底是詐尸還是另有隱情浅碾,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布续语,位于F島的核電站,受9級特大地震影響厦画,放射性物質(zhì)發(fā)生泄漏疮茄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一根暑、第九天 我趴在偏房一處隱蔽的房頂上張望力试。 院中可真熱鬧,春花似錦排嫌、人聲如沸畸裳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怖糊。三九已至,卻和暖如春颇象,著一層夾襖步出監(jiān)牢的瞬間伍伤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工遣钳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扰魂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像劝评,于是被迫代替她去往敵國和親姐直。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容