iOS開(kāi)發(fā)--GIF圖片的選取,壓縮,上傳

之前寫(xiě)了一篇關(guān)于PNG/JPEG圖片的選取,壓縮,上傳(下邊統(tǒng)一簡(jiǎn)稱前文): http://www.reibang.com/p/011b5ef47675, 文本依賴前文的UIImage+ZipSizeAndLength分類進(jìn)行圖片的壓縮等.
總結(jié)一下: 用原生的 UIImagePickerController 選取圖片; 用原生的UIImageJPEGRepresentation()和圖形上下文對(duì)圖片進(jìn)行壓縮; 用AFN進(jìn)行上傳操作.
好了,總結(jié)完之后進(jìn)入今天的主題-----GIF圖片的選取,壓縮,上傳;


目錄:
一 前言
二 選取圖片(重點(diǎn))
三 獲取GIF圖片的原始完整二進(jìn)制數(shù)據(jù)(重點(diǎn))
四 壓縮圖片(重點(diǎn))
五 上傳圖片


一 前言

  有的同學(xué)會(huì)疑惑,難道gif圖片不能用前文說(shuō)的PNG/JPEG圖片的方法進(jìn)行選取,壓縮和上傳嗎?

我可以肯定的給你回答---不能(自己親身敲代碼做的test,如有疑問(wèn),歡迎留言)
原因如下:
1 前文說(shuō)的選取圖片的代碼如下:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"];
}
對(duì)于GIF圖片只能選取到第一幀,無(wú)法取到所有幀.
2 無(wú)法取到GIF所有幀,就不能對(duì)圖片進(jìn)行壓縮
3 無(wú)法取到GIF所有幀,也不能將圖片轉(zhuǎn)化成二進(jìn)制數(shù)據(jù)
4 沒(méi)有二進(jìn)制數(shù)據(jù)就無(wú)法進(jìn)行上傳操作
所以需要換另外一個(gè)方法,具體如下.


二 選取圖片
首先判斷是不是GIF圖片,如果是才需要走GIF的邏輯,判斷方法有如下兩種:

第一種(比較取巧):
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSString *assetString = [[info objectForKey:UIImagePickerControllerReferenceURL] absoluteString];
if([assetString hasSuffix:@"GIF"]){
//這個(gè)圖片是GIF圖片
} else {
}
}
第二種:利用iOS9.0以后出的 Photos/Photos.h 里邊的API進(jìn)行判斷,代碼如下:

NSURL *url = [info objectForKey:UIImagePickerControllerReferenceURL];
PHFetchOptions *options = [[PHFetchOptions alloc]init];
PHFetchResult *set = [PHAsset fetchAssetsWithALAssetURLs:@[url] options:options];
 //轉(zhuǎn)化NSData
PHCachingImageManager *imageManager = [[PHCachingImageManager alloc] init];
PHImageRequestOptions *option = [PHImageRequestOptions new];
option.resizeMode = PHImageRequestOptionsResizeModeFast;
option.synchronous = YES;
PHAsset *asset = set.firstObject;//本文只是選取一張
[imageManager requestImageDataForAsset:asset
               options:option
         resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
                 if ([dataUTI isEqualToString:(__bridge NSString *)kUTTypeGIF]) {
                      //這個(gè)圖片是GIF圖片
                      }else if([dataUTI isEqualToString:(__bridge NSString *)kUTTypePNG]){
                            NSLog(@"PNG圖片");
                      }else if([dataUTI isEqualToString:(__bridge NSString *)kUTTypeJPEG]){
                            NSLog(@"JPEG圖片");
                      }else if([dataUTI isEqualToString:(__bridge NSString *)kUTTypeJPEG2000]){
                            NSLog(@"JPEG2000圖片");
                      }else {
                      }
}];

本文用的是第一種(比較簡(jiǎn)單,效率高)


三 獲取GIF圖片的原始完整二進(jìn)制數(shù)據(jù)(所有幀)
代碼如下:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{      
   NSString *assetString = [[info objectForKey:UIImagePickerControllerReferenceURL] absoluteString];
   if([assetString hasSuffix:@"GIF"]){
       //這個(gè)圖片是GIF圖片
       ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc]init];
       [assetLibrary assetForURL:[info objectForKey:UIImagePickerControllerReferenceURL] resultBlock:^(ALAsset *asset) {
        ALAssetRepresentation *re = [asset representationForUTI:(__bridge NSString *)kUTTypeGIF];;
        NSUInteger size = (NSUInteger)re.size;
        uint8_t *buffer = malloc(size);
        NSError *error;
        NSUInteger bytes = [re getBytes:buffer fromOffset:0 length:size error:&error];
        NSData *data = [NSData dataWithBytes:buffer length:bytes];//這個(gè)就是選取的GIF圖片的原二進(jìn)制數(shù)據(jù)
        free(buffer);
        } failureBlock:^(NSError *error) {
        
    }];
    } else {
   }
}

四 壓縮圖片

利用CoreGraphics/CoreGraphics.h API轉(zhuǎn)換GIF圖片并再次轉(zhuǎn)成符合要求的圖片的二進(jìn)制文件:
封裝方法如下:
+ (NSData *)zipGIFWithData:(NSData *)data {
if (!data) {
return nil;
}
CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);
size_t count = CGImageSourceGetCount(source);
UIImage *animatedImage = nil;
NSMutableArray *images = [NSMutableArray array];
NSTimeInterval duration = 0.0f;
for (size_t i = 0; i < count; i++) {
CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
duration += [self frameDurationAtIndex:i source:source];
UIImage *ima = [UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp];
ima = [ima zip];
[images addObject:ima];
CGImageRelease(image);
if (!duration) {
duration = (1.0f / 10.0f) * count;
}
animatedImage = [UIImage animatedImageWithImages:images duration:duration];
}
CFRelease(source);
return UIImagePNGRepresentation(animatedImage);
}
將三種得到的gif圖片的二進(jìn)制數(shù)據(jù)精心壓縮:
代碼如下:

 ....
NSData *data = [NSData dataWithBytes:buffer length:bytes];//這個(gè)就是選取的GIF圖片的原二進(jìn)制數(shù)據(jù)
data = [self zipGIFWithData:data];
//上傳二進(jìn)制數(shù)據(jù)

五 上傳圖片,與前文上傳圖片一樣

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末光羞,一起剝皮案震驚了整個(gè)濱河市率寡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌苔埋,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件横朋,死亡現(xiàn)場(chǎng)離奇詭異藐俺,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)鱼炒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)衔沼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人昔瞧,你說(shuō)我怎么就攤上這事指蚁。” “怎么了自晰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵凝化,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我酬荞,道長(zhǎng)缘圈,這世上最難降的妖魔是什么劣光? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮糟把,結(jié)果婚禮上绢涡,老公的妹妹穿的比我還像新娘。我一直安慰自己遣疯,他們只是感情好雄可,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著缠犀,像睡著了一般数苫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辨液,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天虐急,我揣著相機(jī)與錄音,去河邊找鬼滔迈。 笑死止吁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的燎悍。 我是一名探鬼主播敬惦,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谈山!你這毒婦竟也來(lái)了俄删?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奏路,失蹤者是張志新(化名)和其女友劉穎畴椰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鸽粉,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斜脂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了潜叛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壶硅,死狀恐怖威兜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庐椒,我是刑警寧澤椒舵,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站约谈,受9級(jí)特大地震影響笔宿,放射性物質(zhì)發(fā)生泄漏犁钟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一泼橘、第九天 我趴在偏房一處隱蔽的房頂上張望涝动。 院中可真熱鬧,春花似錦炬灭、人聲如沸醋粟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)米愿。三九已至,卻和暖如春鼻吮,著一層夾襖步出監(jiān)牢的瞬間育苟,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工椎木, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留违柏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓拓哺,卻偏偏與公主長(zhǎng)得像勇垛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子士鸥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評(píng)論 25 707
  • 前段時(shí)間項(xiàng)目中有一個(gè)上傳頭像的需求,對(duì)圖片有一些要求: 圖片不能超過(guò)2M,寬高最大為200 并且相等,支持JPG/...
    半緣魔君閱讀 7,629評(píng)論 4 18
  • 前天我去爬山了闲孤,今年第一次爬山。在春天爬山還是第一次烤礁。春天讼积,真好。天氣那天也相當(dāng)個(gè)給力脚仔,大晴天勤众。 爬山的前一天我一...
    空心菜真乖閱讀 150評(píng)論 0 0
  • 第七章《辛福是一種轉(zhuǎn)換力》 每個(gè)人身上都有兩套系統(tǒng),社會(huì)系統(tǒng)(男人)負(fù)責(zé)滿足外界要求鲤脏,換回生活需求们颜。自我系統(tǒng)(女人...
    丘峻閱讀 423評(píng)論 0 0
  • 今天,我們的生活中充滿了各種各樣的互聯(lián)網(wǎng)產(chǎn)品猎醇,在衣食住行的方方面面為我們帶來(lái)更便捷更高效的生活體驗(yàn)窥突。作為這些產(chǎn)品的...
    風(fēng)吹麥浪8閱讀 1,279評(píng)論 1 18