最近做的项目中需要上传头像,发表内容的时候也要涉及到图片上传,我直接用的原图上传,但是由于公司网络差,原图太大,老是加载好久好久,所以需要把原图裁剪或者修改分辨率之后再上传,找了好久,做了很多尝试才解决问题,下面记录一下,以便帮助自己查找,也希望能帮助其他人。
我们一般图片上传最好使用UIImageJPEGRepresentation(image, 0.1)这个方法先把图片处理一下,其实这个方法把图片压缩之后,图片大小会小很多(小多少待会再讲),但是在app上人眼的感觉差不多,我对图片的处理如下:
从相册拿到图片后,先经过方法修改图片的大小,也就是分辨率,方法如下:
- (UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)size { UIGraphicsBeginImageContextWithOptions(size,NO,0.0); [image drawInRect:CGRectMake(0, 0, size.width, size.height)]; UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return scaledImage; }
因为我是要上传头像,所以我把图片的size设置为(128,128),这里我在模拟器中截取到了一个320*320的图片,然后经过这个方法压缩后得到的图片是20.3KB,然后我在上传之前又用UIImageJPEGRepresentation(image, 0.05)把图片品质压缩了一下,图片的大小变成了1.5KB左右,这样的小图,在app上加载起来快急了,之前那个七八十KB的图片经常都加载不出来呢,现在OK了~。
总结:1、用 - (UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)size 修改图片的分辨率;
2、用 UIImageJPEGRepresentation(image,0.1)这个方法来压缩图片品质。
其他补充,另一个方法UIImagePNGRepresentation(image),这个方法拿到的图片会比UIImageJPEGRepresentation(image,1.0)拿到的图片大一点,不知道为什么,欢迎其他人来补充。
另一个裁剪图片的某部分区域的方法:
- (UIImage *)croppedImage:(UIImage *)image { if (image) { CGRect rectMAX = CGRectMake(0, 0, 128, 128); CGImageRef subImageRef = CGImageCreateWithImageInRect(image.CGImage, rectMAX); UIGraphicsBeginImageContext(rectMAX.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextDrawImage(context, rectMAX, subImageRef); UIImage *viewImage = [UIImage imageWithCGImage:subImageRef]; UIGraphicsEndImageContext(); CGImageRelease(subImageRef); return viewImage; } return nil; }
这个方法可以获取裁剪后的图片,举个例子,一个256*256的图片,用这个方法之后,就可以获取到左上角一个128*128区域的图片,具体裁剪哪里,可以修改上面rectMax的坐标和大小。