热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IOS开发压缩后图片模糊问题解决

这篇文章主要为大家介绍了IOS开发压缩后图片模糊问题解决实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

压缩原理:找出那些重复出现的字符串,然后用更短的符号代替,达到缩短字符串的目的。

比如,一篇文章大量使用"#公众号::iOS逆向"这个词语,我们用"iOS"代替,就缩短了6个字符,如果用"i"代替,就缩短了8个字符。

事实上,只要保证对应关系,可以用任意字符代替那些重复出现的字符串。

本质上,所谓"压缩"就是找出文件内容的概率分布,将那些出现概率高的部分代替成更短的形式。

所以,内容越是重复的文件,就可以压缩地越小。

比如,"ABABABABABABAB"可以压缩成"7AB"。

I 图片压缩的两种方式

  • 质量压缩:即损失图片的质量为代价,大小(长宽尺寸)不变;
          UIImageJPEGRepresentation(image, 0.0);//JPEG
     NSData * imageData = UIImagePNGRepresentation(image);
`
//推荐使用png 因为`PNG:0x89 image/png ,压缩比没有 JPG 高,但是无损压缩,解压缩性能高,苹果推荐的图像格式!
  • 像素压缩(比例压缩):通过减少长宽方向的像素数量;
          [sourceImage drawInRect:CGRectMake(0,0,targetWidth, targetHeight)] ;

本文的压缩方案:质量压缩(0.5) 结合比例压缩(1028):

1、质量压缩的比例(质量压缩使用系统APIUIImageJPEGRepresentation) 2、比例压缩使用:drawInRect

II、 解决压缩之后图片模糊的问题

模糊的问题的大部分原因:使用第三方框架,(比如QMUIKit),在选择相册预览的时候,就把图片压缩了很模糊了。

应用场景:针对协议类型这种大图

2.1、如果是拍照,可以压缩一下分辨率,否则上传很慢

不用使用预览图进行上传

//    [self imgUpLoad:imageAsset.previewImage Max:1 Index:1];
    [self imgUpLoad:imageAsset.originImage Max:1 Index:1];

如果是拍照,可以压缩一下分辨率,否则上传很慢

    return  [self imageCompressForSize:image targetSize:size];

拍照压缩分辨率的例子

- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSString *type = [info objectForKey:UIImagePickerControllerMediaType];
    //当选择的类型是图片
    if ([type isEqualToString:@"public.image"])
    {
        UIImage *image1 = [info objectForKey:UIImagePickerControllerOriginalImage];
        image1 = [ControlManager image:image1 scaleToSize:CGSizeMake(1000, 1200)];// 压缩分辨率 便于上传
        [picker dismissViewControllerAnimated:YES completion:nil];
        [SVProgressHUD showWithStatus:@"上传中.." maskType:SVProgressHUDMaskTypeGradient];
        [self imgUpLoad:image1 Max:1 Index:1];
    }
}

2.2、 质量压缩(0.5) 结合比例压缩(1028)

用法

        NSData * imageData = UIImageJPEGRepresentation( [image compressWithTargetPixel:1028], k_UIImageJPEGRepresentationcompressionQuality);

质量压缩的比例

(质量压缩使用系统APIUIImageJPEGRepresentation

#define k_UIImageJPEGRepresentationcompressionQuality 0.5

比例压缩的代码

- (UIImage *)compressWithTargetPixel:(NSUInteger)targetPx {
}

III 针对业务场景选择图片格式

3.1 如何区分不同格式的图像的

  • 根据图像数据第一个字节来判断的!

 // NSData+ImageContentType.m    + (NSString *)sd_contentTypeForImageData:

 PNG:0x89 image/png ,压缩比没有 JPG 高,但是无损压缩,解压缩性能高,苹果推荐的图像格式!

 JPG:0xFF image/jpeg,压缩比最高的一种图片格式,有损压缩!最多使用的场景,照相机!解压缩的性能不好!

 GIF:0x47 image/gif ,序列桢动图,特点:只支持 256 种颜色!最流行的时候在 1998~1999,有专利的! 

3.2 使用场景分析

3.2.1 JPEG/JPG

  • 特点:有损压缩、体积小、不支持透明
  • 使用场景:颜色丰富的照片,JPG是通用的选择,如大的背景图、轮播图或Banner图。

3.2.2 PNG

  • 特点:无损压缩、质量高、体积大、支持透明。
  • 使用场景:透明图片的业务场景,如小的Logo、颜色简单且对比强烈的图片或背景。

3.2.3 SVG

  • 特点:文本文件、体积小、不失真、兼容性好、无需多端、多分辨率适配、较强的交互特性、渲染成本比较高。
  • 使用场景:图片色彩相对简单的业务场景。

3.2.4 Base64

  • 特点:文本文件、依赖编码,Base64编码后,图片大小会膨胀为原文件的4/3。
  • 使用场景:小图标(<8KB)解决方案。

3.2.5 WebP

  • 特点:WebP图片是一种新的图像格式,由Google开发。与png、jpg相比,相同的视觉体验下,WebP图像的尺寸缩小了大约30%。另外,WebP图像格式还支持有损压缩、无损压缩、透明和动画,但有兼容性问题。
  • 使用场景:图片占较大的商场类网站,目前Google、Facebook、ebay、淘宝、腾讯、美团等已经在用。

“打开淘宝网,假如你是chrome浏览器,你会发现,所有图片都是webp结尾的,淘宝网图片运用了webp。假如你是safari浏览器,看到图片就是jpg或者png了,淘宝网自动判断浏览器支持不支持webp,假如支持,则输出相应的图片格式!

以上就是IOS开发压缩后图片模糊问题解决的详细内容,更多关于IOS压缩图片模糊的资料请关注其它相关文章!


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
author-avatar
mobiledu2502887287
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有