iOS 11 HEIF/HEIC圖片轉(zhuǎn)JPG、UIImage加載HEIF

iOS 11中,如果你是iPhone 7及以上設(shè)備,系統(tǒng)用了新的格式來存儲視頻和圖片,



如果你的App支持上傳圖片原文件,那么很可能會有圖片無法顯示的問題。
讀取圖片原文件的代碼一般是下面這樣的,傳到后臺之后得到一個url,webview和UIImage是無法顯示的。

[[PHImageManager defaultManager] requestImageDataForAsset:phAsset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
    if (imageData) {
        
    }
}];

當(dāng)我們講適配的時候,往往比較多地關(guān)注UI的適配,容易忽略一些看不見的東西。

識別HEIF

識別HEIF文件的方法和識別GIF一樣,對比文件UTI(uniformTypeIdentifier)

__block BOOL isHEIF = NO;
if (iOSVersionGreaterThanOrEqualTo(@"9.0")) {
    NSArray *resourceList = [PHAssetResource assetResourcesForAsset:phAsset];
    [resourceList enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        PHAssetResource *resource = obj;
        NSString *UTI = resource.uniformTypeIdentifier;
        if ([UTI isEqualToString:@"public.heif"] || [UTI isEqualToString:@"public.heic"]) {
            isHEIF = YES;
            *stop = YES;
        }
    }];
} else {
    NSString *UTI = [phAsset valueForKey:@"uniformTypeIdentifier"];
    isHEIF = [UTI isEqualToString:@"public.heif"] || [UTI isEqualToString:@"public.heic"];
}

下面這個方法不準(zhǔn)確

[[PHImageManager defaultManager] requestImageDataForAsset:phAsset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
    //這個dataUTI只是根據(jù)文件擴(kuò)展名傳過來的,不準(zhǔn)確
}];

轉(zhuǎn)換

方法一:有損

既然我們可以前置識別了,那么針對HEIF可以選擇通過requestImageDataForAsset:phAsset獲取到UIImage,再用UIImageJPEGRepresentation轉(zhuǎn)為NSData,不過轉(zhuǎn)為UIImage之后,圖片的其他信息(Exif、GPS等)就丟失了。

方法二:無損
[[PHImageManager defaultManager] requestImageDataForAsset:phAsset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
    if (isHEIF) {
        CIImage *ciImage = [CIImage imageWithData:imageData];
        CIContext *context = [CIContext context];
        NSData *jpgData = [context JPEGRepresentationOfImage:ciImage colorSpace:ciImage.colorSpace options:@{}];
    } else {
    }
}];
方法三:無損
if (isHEIF) {
    [phAsset requestContentEditingInputWithOptions:nil completionHandler:^(PHContentEditingInput * _Nullable contentEditingInput, NSDictionary * _Nonnull info) {
        if (contentEditingInput.fullSizeImageURL) {
            CIImage *ciImage = [CIImage imageWithContentsOfURL:contentEditingInput.fullSizeImageURL];
            CIContext *context = [CIContext context];
            NSData *jpgData = [context JPEGRepresentationOfImage:ciImage colorSpace:ciImage.colorSpace options:@{}];
        }
    }];
}

UIImage加載HEIF

CIImage *ciImage = [CIImage imageWithContentsOfURL:url];
imageView.image = [UIImage imageWithCIImage:ciImage];

這個方法有點(diǎn)慢,也可以使用CGImageSourceCreateWithURL和CGImageSourceCreateImageAtIndex加載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,251評論 4 61
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,521評論 25 708
  • 昨天和康康共讀《我最喜歡車子》《the wheels on the bus》《媽媽的吻》51/1000 媽媽思考:...
    馬靖恩閱讀 316評論 0 1
  • 一三年高考的時候,考最后一科的英語,提前了幾分鐘答完所有的題目。 輕輕的把卷子蓋好,收拾好桌面...
    零啟閱讀 341評論 0 1
  • 啟動mysql.server start 命令行登錄 查看所有數(shù)據(jù)庫 創(chuàng)建數(shù)據(jù)庫 指定數(shù)據(jù)庫
    738bc070cd74閱讀 200評論 0 0