重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
项目工程里面用到了图片压缩,这边做了个笔记整理了一下。
创新互联自2013年起,是专业互联网技术服务公司,拥有项目成都网站设计、成都做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元靖州做网站,已为上家服务,为靖州各地企业和个人服务,联系电话:028-86922220
压缩:图片文件的体积变小,长宽尺寸不变,质量可能下降。
裁剪:文件尺寸变小,长宽尺寸变小,文件体积大小会变小。
在iOS中图片压缩使用到两个关键方法: UIImageJPEGRepresentation 和 UIImagePNGRepresentation 使用方式如下。
下面我们用图片测试一下两个方法的差异。就使用的本文上面的那张傍晚iPhone拍摄的图片,具体参数如图:
使用 UIImagePNGRepresentation(image) 返回的数据量大小为 1,299,138 字节(磁盘上的1.3 MB) 。
使用 UIImageJPEGRepresentation(image, 1.0) 返回的数据量大小为 183,531 字节(磁盘上的184 KB 。
可以看到 UIImagePNGRepresentation(UIImage \*image) 要比 UIImageJPEGRepresentation(UIImage* image, 1.0) 返回的图片数据量大很多。
使用 UIImageJPEGRepresentation 可以大幅度降低图片的数据量,比如刚才拍摄的那张图片,通过该方法压缩之后,数据大小仅为 184 KB 。 更改压缩系数为0.5再读取数据时,返回的数据大小只有 111 KB 。图片大小压缩了,但是清晰度并没有像差多少,质量也没有明显的降低。
所以在读取图片数据的时候,建议优先使用 UIImageJPEGRepresentation ,根据实际业务需求,设置压缩系数。
工作中遇到需要将图片压缩之后上传的需求。经过多方查询资料,目前总结出来两种方式总结一下备用。
UIImageJPEGRepresentation(image, compression)
这个方法可以将iPhone拍摄的照片压缩到几百Kb的极限值,到极限值之后不管compression这个参数多小,该函数返回的数据大小都不会再改变。也就是说这个方法的压缩是有最小值的,得到的是jpg格式。
另外有一个方法UIImagePNGRepresentation(#UIImage * _Nonnull image#)这个方法得到的数据会比之前那个方法得到的数据占用空间更大。
为了达到压缩的目的,这种方法是有损的,就是会降低图片质量。
这种方法的到的图片,newSize越小质量越差,但是得到的图片占用内存越小。设置多大的newSize自己斟酌决定。
综合一下自己平常在开发中常用的就是,先使用第一种方法保持精度不变,compression选择0.6或者0.7进行第一次压缩,然后再用第二种方法进行尺寸压缩,得到的就是我们最终想要的图片。
iphone压缩照片最简单的方法如下:
设备:苹果8。
系统:ios13.2.1。
软件:视频图片压缩6.2.1。
1、打开图片压缩软件
首先在iPhone桌面点击下载的图片压缩软件,进入软件页面。
2、选择压缩图片
在软件首页,点击选择“压缩照片”功能,进入照片选择页面。
3、开始压缩
在照片选择页面选择需要压缩的照片,选择完成后点击页面上的“压缩”开始图像压缩操作。
4、选择参数
在弹出的确认框中,根据实际压缩需要调整压缩参数。
5、压缩完成
软件压缩完成后,页面会提示“压缩文件成功”。 这时候就可以根据页面提示查看压缩后的图片了。
我们假设要在截图中的举行图片展示区显示图片,由于原图片的宽高比例与图片显示窗口的宽高比例不一定相同,所以,直接将图片扔进去会改变图片的宽高比例,展示效果不好。
这时你可能想到设置UIImageView的属性 _imageView.contentMode = UIViewContentModeCenter; 设置该属性后,我们会发现图片的宽高比例确实正确了,但是窗口中只显示了图片的一部分,这说明图片整体尺寸没有压缩,按照原图进行显示了。怎样才能达到既缩小图片又不改变原来的宽高比例呢?
方法一:将图片按照原来的宽高比例压缩到与窗口合适的大小,然后在设置了_imageView.contentMode = UIViewContentModeCenter; 这个属性的UIImageView中展示压缩后的图片。
//压缩图片
- (UIImage *)image:(UIImage*)image scaledToSize:(CGSize)newSize
{
// 创建一个图形上下文形象
UIGraphicsBeginImageContext(newSize);
// 告诉旧图片画在这个新的环境,所需的
// 新的尺寸
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
// 新形象从上下文
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
// 结束上下文
UIGraphicsEndImageContext();
// 返回新形象
return newImage;
}
上面方法的参数newSize是和图片显示窗口差不多大的,结果出现了原图清晰,但压缩后图片不清晰的情况。
方法二:按照窗口宽高比例,将原图横向或者纵向裁剪掉多余的部分,然后不设置UIImageView的contentMode属性,将裁剪后的图片送进去,使其自动适应窗口。
//裁剪图片
- (UIImage *)cutImage:(UIImage*)image
{
//压缩图片
CGSize newSize;
CGImageRef imageRef = nil;
if ((image.size.width / image.size.height) (_headerView.bgImgView.size.width / _headerView.bgImgView.size.height)) {
newSize.width = image.size.width;
newSize.height = image.size.width * _headerView.bgImgView.size.height / _headerView.bgImgView.size.width;
imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake(0, fabs(image.size.height - newSize.height) / 2, newSize.width, newSize.height));
} else {
newSize.height = image.size.height;
newSize.width = image.size.height * _headerView.bgImgView.size.width / _headerView.bgImgView.size.height;
imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake(fabs(image.size.width - newSize.width) / 2, 0, newSize.width, newSize.height));
}
return [UIImage imageWithCGImage:imageRef];
}
结果表明方法二效果更好。
我们可以在不减小图片的分辨率(质量可以适当减小)的情况下,显著减小图片的大小
上面方法等价于下面: 压缩图片质量
//将图片压缩到指定比例
等比例压缩
图片的压缩其实是俩概念,
1、是 “压” 文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降,
2、是 “缩” 文件的尺寸变小,也就是像素数减少。长宽尺寸变小,文件体积同样会减小。
这个 UIImageJPEGRepresentation(image, 0.0),是1的功能。
这个 [sourceImage drawInRect:CGRectMake(0,0,targetWidth, targetHeight)] 是2的功能。
所以,这俩你得结合使用来满足需求,不然你一味的用1,导致,图片模糊的不行,但是尺寸还是很大。
我们还可以对图片进行部分截取
//--------------截取部分图片到指定位置-------------------------