iOS不支持HEIC格式的图片显示和标签函数显示问题及解决方案

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: iOS不支持HEIC格式的图片显示和标签函数显示问题及解决方案

iOS不支持HEIC格式图片解决方案:在阿里云的图片下载规则里配置为把WebP格式图片转换成png或 jpeg格式的图片。从根源解决是当上传这种格式图片时,以文件名后缀识别出这种格式的图片,然后把它转换成png或 jpeg格式的图片再上传。

HEIC可是连iphone4,5,6都不支持的图片格式,不知道苹果为何推出连自己的产品都不完全支持的图片格式干什么,徒给我们码农添麻烦。看来支持万能格式的图片上传也是有罪的。想法是美好的,现实是骨感的。


HEIC是iOS 11更新后,iPhone 7及其后硬件,在拍摄照片时的默认图像存储格式。

HEIC是一种图像格式,上线时间还比较短,只有4年左右。自iOS 11和macOS High Sierra(10.13)内测开始,苹果将HEIC设置为图片存储的默认格式。

与JPG相比,它占用的空间更小,画质更加无损。

HEIC格式照片支持iOS11及macOS High Sierra(10.13)及更新版本。

但是此种格式是无法在Windows 中直接使用看图软件打开的(Windows10 RS4开始支持该格式)。

所以如果想要在电脑中查看HEIC图片,最好使用在线免费HEIC图片转换应用,将HEIC转JPG,这样就可以在PC上打开iPhone HEIC照片了。

想推出一种流行的像png或 jpeg一样的图像压缩格式是很不容易的。

HEIC格式一张图片。

安卓可以产生WebP这种格式的图片,微信网页不支持这种格式图片,苹果手机也不支持这种格式的图片,但是安卓支持。HEIC图片也有类似的尴尬。

下面是上传图片时,发现是不支持格式的图片(除PNG, BMP,GIF,JPG,JPEG常规格式以外的图片),就把它转化为png格式的图片再上传。为何不使用JPEG格式,因为JPEG不支持透明背景,而WebP和都HEIC都支持透明背景。

-(NSString *)getFileExtend:(NSString *)localId
                secondFlag:(BOOL)secondFlag
{
    NSString *urlStr = localId;
    NSLog(@"localId = %@",localId);
    if(!([urlStr containsString:@"yxLocalFile://"] || [urlStr containsString:@"yxlocalfile://"])) {
        return nil;
    }
    NSArray* arr = [urlStr componentsSeparatedByString:@"yxLocalFile://"];
    NSArray* arr2 = [urlStr componentsSeparatedByString:@"yxlocalfile://"];
    if((arr.count <= 1) && (arr2.count <= 1))
    {
        return nil;
    }
    else
    {
        if(arr.count == 1)
        {
            arr = arr2;
        }
        NSString *yxLocalFile = arr[arr.count - 1];
        NSArray* jpgArr = [yxLocalFile componentsSeparatedByString:@"."];
        if(jpgArr.count <= 1)
        {
            return nil;
        }
        else if((jpgArr.count > 2) && secondFlag)
        {
            NSString *fileExtend = jpgArr[jpgArr.count-2];
            if(isEmptyString(fileExtend))
            {
                return nil;
            }
            return [fileExtend uppercaseString];
        }
        else
        {
            NSString *fileExtend = jpgArr[jpgArr.count-1];
            if(isEmptyString(fileExtend))
            {
                return nil;
            }
            return [fileExtend uppercaseString];
        }
    }
}

//检查图片的后缀是否是支持图片格式
-(BOOL)checkImageFileExtend
{
    if(isEmptyString(self))
    {
        return YES;
    }
    NSString *fileExtend = [self uppercaseString];
    //https://image.oss.m.1-joy.com/2018-09-19/6578b5b7ae171f0d8dcbd628e1bfc6fb.HEIC?x-oss-process=style/wxlookup
    NSArray* fileExtendArr = [fileExtend componentsSeparatedByString:@"?"];
    if(fileExtendArr.count > 1)
    {
        fileExtend = fileExtendArr[0];
    }
    if([fileExtend isEqualToString:@"PNG"] || [fileExtend isEqualToString:@"BMP"] || [fileExtend isEqualToString:@"GIF"] || [fileExtend isEqualToString:@"JPG"] || [fileExtend isEqualToString:@"JPEG"])
    {
        return YES;
    }
    return NO;
}

//使用的代码片段
            NSString *fileExtend = [self getFileExtend:localId secondFlag:YES];
            if(![fileExtend checkImageFileExtend])
            {
                UIImage* image = [self compressImageWithDada:imageData];
                imageData = UIImagePNGRepresentation(image);
                fileExtend = [self getFileExtend:localId secondFlag:NO];
            }

对标签函数预加载图片的处理,在HybridNSURLProtocol.m文件里完成,发现是不支持格式的图片(除PNG, BMP,GIF,JPG,JPEG常规格式意外的图片),就把它转化为png格式的图片显示:

-(NSString *)getFileExtend:(NSString *)localId
{
    NSString *urlStr = localId;
    NSLog(@"localId = %@",localId);
    if(!([urlStr containsString:@"yxLocalFile://"] || [urlStr containsString:@"yxlocalfile://"])) {
        return nil;
    }
    NSArray* arr = [urlStr componentsSeparatedByString:@"yxLocalFile://"];
    NSArray* arr2 = [urlStr componentsSeparatedByString:@"yxlocalfile://"];
    if((arr.count <= 1) && (arr2.count <= 1))
    {
        return nil;
    }
    else
    {
        if(arr.count == 1)
        {
            arr = arr2;
        }
        NSString *yxLocalFile = arr[arr.count - 1];
        NSArray* jpgArr = [yxLocalFile componentsSeparatedByString:@"."];
        if(jpgArr.count <= 1)
        {
            return nil;
        }
        else if(jpgArr.count > 2)
        {
            NSString *fileExtend = jpgArr[jpgArr.count-2];
            if(isEmptyString(fileExtend))
            {
                return nil;
            }
            return [fileExtend uppercaseString];
        }
        else
        {
            NSString *fileExtend = jpgArr[jpgArr.count-1];
            if(isEmptyString(fileExtend))
            {
                return nil;
            }
            return [fileExtend uppercaseString];
        }
    }
}


- (void)startLoading
{
    NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy];
    //给我们处理过的请求设置一个标识符, 防止无限循环,
    [NSURLProtocol setProperty:@YES forKey:KHybridNSURLProtocolHKey inRequest:mutableReqeust];
    
    NSString *urlStr = mutableReqeust.URL.absoluteString;
    NSLog(@"mutableReqeust.URL.absoluteString = %@",urlStr);
    NSLog(@"请求方式 == %@",mutableReqeust.HTTPMethod);
    NSString *fileName = [self getYxLocalFile:urlStr];
    if(!isEmptyString(fileName))
    {
        NSString *MIMETypeStr = @"";
        NSString *fileExtend = [self getFileExtend:urlStr];
        if(fileExtend && ([fileExtend compare:@"png" options:NSCaseInsensitiveSearch |NSNumericSearch] ==NSOrderedSame))
        {
            MIMETypeStr =@"image/png";
        }
        else if(fileExtend && (([fileExtend compare:@"bmp" options:NSCaseInsensitiveSearch |NSNumericSearch] ==NSOrderedSame)
                               || ([fileExtend compare:@"gif" options:NSCaseInsensitiveSearch |NSNumericSearch] ==NSOrderedSame)))
        {
            //bmp\dib
            MIMETypeStr =@"image/bmp";
        }
        else if(fileExtend && ([fileExtend compare:@"gif" options:NSCaseInsensitiveSearch |NSNumericSearch] ==NSOrderedSame))
        {
            MIMETypeStr =@"image/gif";
        }
        else
        {
            //苹果拍照的图片都是JPG格式的图片,jpe\jpeg\jpg
            MIMETypeStr =@"image/jpeg";
        }
        NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[mutableReqeust URL]
                                             MIMEType:MIMETypeStr
                                expectedContentLength:-1
                                     textEncodingName:nil];
        
        NSMutableArray *tempArr = [NSMutableArray array];
        [tempArr addSafeObject:fileName];
        PHFetchResult *fetchResult = [PHAsset fetchAssetsWithLocalIdentifiers:tempArr options:nil];
        @weakify(self);
        [self fetchImageWithAsset:fetchResult.firstObject imageBlock:^(NSData *imageData) {
            @strongify(self);
            NSString *fileExtend = [self getFileExtend:urlStr];
            if(![fileExtend checkImageFileExtend])
            {
                UIImage* image = [UIImage imageWithData:imageData];
                imageData = UIImagePNGRepresentation(image);
            }
            else
            {
                UIImage *image = [UIImage imageWithData:imageData];
                if((maxShareImageWidth > 0) && (maxShareImageHeight > 0) && ((image.size.height > maxShareImageHeight) || (image.size.width > maxShareImageWidth)))
                {
                    UIImage* newImage = [self compressImageWithImage:image];
                    imageData = UIImageJPEGRepresentation(newImage, 0.7);
                    fileExtend = @"JPG";
                }
            }
            NSLog(@"imageData:%@", imageData);
            [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
            [[self client] URLProtocol:self didLoadData:imageData];
            [[self client] URLProtocolDidFinishLoading:self];
        }];

        return;
    }
}

用到的NSString扩展类NSString+Extension.m文件中的函数:

//检查图片的后缀是否是支持图片格式
-(BOOL)checkImageFileExtend
{
    if(isEmptyString(self))
    {
        return YES;
    }
    NSString *fileExtend = [self uppercaseString];
    //https://image.oss.m.1-joy.com/2018-09-19/6578b5b7ae171f0d8dcbd628e1bfc6fb.HEIC?x-oss-process=style/wxlookup
    NSArray* fileExtendArr = [fileExtend componentsSeparatedByString:@"?"];
    if(fileExtendArr.count > 1)
    {
        fileExtend = fileExtendArr[0];
    }
    if([fileExtend isEqualToString:@"PNG"] || [fileExtend isEqualToString:@"BMP"] || [fileExtend isEqualToString:@"GIF"] || [fileExtend isEqualToString:@"JPG"] || [fileExtend isEqualToString:@"JPEG"])
    {
        return YES;
    }
    return NO;
}
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
1月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
69 7
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台解决方案
【9月更文挑战第27天】在移动应用开发的广阔天地中,安卓和iOS两大操作系统如同双子星座般耀眼。开发者们在这两大平台上追逐着创新的梦想,却也面临着选择的难题。如何在保持高效的同时,实现跨平台的开发?本文将带你探索跨平台开发的魅力所在,揭示其背后的技术原理,并通过实际案例展示其应用场景。无论你是安卓的忠实拥趸,还是iOS的狂热粉丝,这篇文章都将为你打开一扇通往跨平台开发新世界的大门。
|
3月前
|
测试技术 开发工具 iOS开发
iOS自动化测试方案(三):WDA+iOS自动化测试解决方案
这篇文章是iOS自动化测试方案的第三部分,介绍了在没有MacOS系统条件下,如何使用WDA(WebDriverAgent)结合Python客户端库facebook-wda和tidevice工具,在Windows系统上实现iOS应用的自动化测试,包括环境准备、问题解决和扩展应用的详细步骤。
192 1
iOS自动化测试方案(三):WDA+iOS自动化测试解决方案
|
3月前
|
前端开发 开发工具 Android开发
探索安卓与iOS应用开发:跨平台解决方案的崛起
【8月更文挑战第27天】在移动设备日益普及的今天,安卓和iOS系统占据了市场的主导地位。开发者们面临着一个重要问题:是选择专注于单一平台,还是寻找一种能够同时覆盖两大系统的解决方案?本文将探讨跨平台开发工具的优势,分析它们如何改变了移动应用的开发格局,并分享一些实用的开发技巧。无论你是新手还是资深开发者,这篇文章都将为你提供有价值的见解和建议。
|
3月前
|
前端开发 JavaScript Android开发
探索Android和iOS开发中的跨平台解决方案
【8月更文挑战第1天】随着移动应用市场的不断扩张,开发者面临一个共同的挑战——如何高效地为多个平台创建和维护应用程序。本文将深入探讨跨平台开发工具,特别是Flutter和React Native,通过比较它们的优势和限制,并辅以实际代码示例,揭示这些工具如何帮助开发者在保持高性能的同时,实现代码的最大化重用。
|
3月前
|
前端开发 JavaScript Android开发
安卓与iOS开发中的跨平台解决方案
【8月更文挑战第24天】在移动应用开发领域,安卓和iOS两大平台占据了主导地位。然而,为这两个平台分别开发和维护应用会带来额外的时间和成本。本文将探讨跨平台开发的概念、优势以及流行的跨平台框架,如React Native和Flutter,并分析它们如何解决多平台开发的挑战。
|
4月前
|
Swift iOS开发 Kotlin
苹果iOS新手开发之Swift中实现类似Kotlin的作用域函数
Swift可通过扩展实现类似Kotlin作用域函数效果。如自定义`let`, `run`, `with`, `apply`, `also`,增强代码可读性和简洁性。虽无直接内置支持,但利用Swift特性可达成相似功能。
59 7
|
6月前
|
存储 Web App开发 Android开发
iOS不支持WebP格式图片解决方案和iPhone 7及其后硬件拍照的HEIC格式图片
iOS不支持WebP格式图片解决方案和iPhone 7及其后硬件拍照的HEIC格式图片
597 1
iOS不支持WebP格式图片解决方案和iPhone 7及其后硬件拍照的HEIC格式图片
|
6月前
|
iOS开发
iOS16.1系统由于一个系统弹窗无法取消,导致屏幕卡死无法关机问题及解决方案
iOS16.1系统由于一个系统弹窗无法取消,导致屏幕卡死无法关机问题及解决方案
730 0
|
6月前
|
iOS开发
iOS中如何显示后台返回的带有html标签的富文本字符串
iOS中如何显示后台返回的带有html标签的富文本字符串
59 0