iOS图片压缩处理

首先,我们必须明确图片的压缩其实是两个概念:

  1. “压” 是指文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降。
  2. “缩” 是指文件的尺寸变小,也就是像素数减少,而长宽尺寸变小,文件体积同样会减小。

图片“压”处理


对于“压”的功能,我们可以使用UIImageJPEGRepresentationUIImagePNGRepresentation方法实现,如:

<code class="hljs fix has-numbering"><span class="hljs-attribute">NSData *imgData </span>=<span class="hljs-string"> UIImageJPEGRepresentation(image, 0.5);

</span></code>

第一个参数是图片对象,第二个参数是压的系数,其值范围为0~1。

UIImageJPEGRepresentation方法的官方注释是:return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least)

关于PNG和JPEG格式压缩

  1. UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数而UIImagePNGRepresentation只需要图片引用作为参数.

  2. UIImagePNGRepresentation(UIImage \*image)要比UIImageJPEGRepresentation(UIImage* image, 1.0)返回的图片数据量大很多.

同样的一张照片, 使用UIImagePNGRepresentation(image)返回的数据量大小为199K,而 UIImageJPEGRepresentation(image, 1.0)返回的数据量大小只为140K,比前者少了59K.

如果对图片的清晰度要求不是极高,建议使用UIImageJPEGRepresentation,可以大幅度降低图片数据量.比如,刚才拍摄的图片,通过调用UIImageJPEGRepresentation(image, 1.0)读取数据时,返回的数据大小为140K,但更改压缩系数为0.5再读取数据时,返回的数据大小只有11K,大大压缩了图片的数据量,而且清晰度并没有相差多少,图片的质量并没有明显的降低。因此,在读取图片数据内容时,建议优先使用UIImageJPEGRepresentation,并可根据自己的实际使用场景,设置压缩系数,进一步降低图片数据量大小。

提示:压缩系数不宜太低,通常是0.3~0.7,过小则可能会出现黑边等。

笔者统计了iphone设备上的全屏图和原始图在压缩前和压缩后的大小,我们需要根据图片压缩后在PC上的清晰度来决定最终选择哪个压缩系数。

图片“缩”处理


通过[sourceImage drawInRect:CGRectMake(0, 0, targetWidth, targetHeight)]可以进行图片“缩”的功能。如下是笔者对图片尺寸缩的api

<code class="hljs objectivec has-numbering"><span class="hljs-comment">/*!
 *  @author 张康, 16-09-30 10:12:01
 *
 *  压缩图片至目标尺寸
 *
 *  @param sourceImage 源图片
 *  @param targetWidth 图片最终尺寸的宽
 *
 *  @return 返回按照源图片的宽、高比例压缩至目标宽、高的图片
 */</span>
- (<span class="hljs-built_in">UIImage</span> *)compressImage:(<span class="hljs-built_in">UIImage</span> *)sourceImage toTargetWidth:(<span class="hljs-built_in">CGFloat</span>)targetWidth {
  <span class="hljs-built_in">CGSize</span> imageSize = sourceImage<span class="hljs-variable">.size</span>;

  <span class="hljs-built_in">CGFloat</span> width = imageSize<span class="hljs-variable">.width</span>;
  <span class="hljs-built_in">CGFloat</span> height = imageSize<span class="hljs-variable">.height</span>;

  <span class="hljs-built_in">CGFloat</span> targetHeight = (targetWidth / width) * height;

  UIGraphicsBeginImageContext(CGSizeMake(targetWidth, targetHeight));
  [sourceImage drawInRect:CGRectMake(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, targetWidth, targetHeight)];

  <span class="hljs-built_in">UIImage</span> *newImage = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();

  <span class="hljs-keyword">return</span> newImage;
}</code>

我们对图片只“压”而不缩,有时候是达不到我们的需求的。因此,适当地对图片“缩”一“缩“尺寸,就可以满足我们的需求。

提示:我们获取到的全屏图的宽高不是指设备的宽高,通常会比设置的宽要大,高度可能相等。我们可以拍全景图,那么宽就很大了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果你在使用 uniapp 在 iOS 上传图片时遇到了失败的情况,那么可能是因为以下几种原因造成的: 1. 你的网络环境不稳定,导致上传失败。 2. 你的图片太大,超过了服务器能够处理的大小限制。 3. 服务器端出了问题,导致无法正常接收上传的图片。 4. 你的 uniapp 客户端代码存在 bug,导致无法正常上传图片。 如果你不确定是哪个原因造成的上传失败,建议你尝试以下步骤来解决这个问题: 1. 确保你的网络环境良好。 2. 尝试将图片的大小压缩到合理的范围内再上传。 3. 尝试在不同的时间上传图片,如果总是在同一时间上传失败,可能是服务器端出了问题。 4. 检查你的 uniapp 客户端代码,确保没有任何 bug 影响了图片上传的过程。 ### 回答2: uniapp 是一种基于Vue.js开发的跨平台应用开发框架,支持同时开发iOS和Android应用。对于uniapp在iOS上上传图片失败的问题,可能有以下几个原因: 1. 权限问题:iOS系统对于相机和相册的访问需要获取用户的权限,如果应用未获取相应的权限,就无法上传图片。可以在uniapp的manifest.json文件中设置相应的权限配置。 2. 图片路径问题:iOS系统中,相机拍摄的照片和从相册选取的照片存储在不同的位置,导致图片路径可能不一致。在uniapp中,可以使用uni.chooseImage方法选择照片,回调函数中可以获取到选择的图片的临时文件路径,可以根据具体的需要进行处理。 3. 图片大小限制:iOS系统对于图片大小有一定的限制,如果选择的图片大小超过了系统限制,上传可能会失败。可以在uniapp中使用uni.compressImage方法对图片进行压缩,减小图片的大小。 4. 上传服务器问题:上传图片失败也有可能是服务器端的问题,可能是上传接口的问题或者网络连接的问题。可以使用浏览器调试工具或者抓包工具查看具体的错误信息,以便排查问题。 针对以上可能的问题,可以逐一排查并解决。同时,要确保uniapp使用的是最新版本,以获得最新的修复和功能支持。如果以上方法都没有解决问题,可以参考uniapp官方文档或者查找相关的社区讨论,寻求帮助。 ### 回答3: uniapp 是一种跨平台开发框架,它可以将同一个代码基础同时编译成多个平台的应用程序。但是在 iOS 平台上,有时候会出现上传图片失败的情况。 这种问题的出现可能有多种原因,我们可以尝试以下几个解决方法: 1. 检查网络连接:首先,我们需要确保 iOS 设备连接到了稳定的网络,如果网络不稳定或者信号弱,可能会导致上传失败。可以尝试连接到其他网络或者重启网络设备来解决问题。 2. 检查文件格式:iOS 平台对文件格式有一些限制,如果上传的图片格式不被支持,可能会导致上传失败。可以将图片转换成 iOS 支持的格式,例如 JPEG 或者 PNG 格式,然后尝试重新上传。 3. 检查文件大小:iOS 平台对上传文件的大小也有一定限制,如果上传的图片文件过大,可能会导致上传失败。可以尝试缩小图片的尺寸或者压缩图片的质量,然后重新上传。 4. 检查权限设置:iOS 平台对应用的文件访问权限有一些限制,如果没有正确设置权限,可能会导致上传失败。可以在应用的设置中检查并修改文件访问权限,然后重新上传。 如果以上方法都没有解决问题,可以尝试查看 iOS 设备的日志或者调试信息,看是否有相关的错误提示。另外,也可以尝试在其他 iOS 设备上运行同样的代码,以确定是否是设备特定的问题。如果问题仍然存在,可以提供更多的细节信息,以便我们能够更好地帮助解决该问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值