您的位置:首页 > 移动开发 > IOS开发

iOS - 关于图片压缩处理

2017-01-11 11:11 435 查看
图片的压缩其实是俩概念,

1、是 “压” 文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降,

2、是 “缩” 文件的尺寸变小,也就是像素数减少。长宽尺寸变小,文件体积同样会减小。

这个 UIImageJPEGRepresentation(image, 0.0),是1的功能。

这个 [sourceImage drawInRect:CGRectMake(0,0,targetWidth, targetHeight)] 是2的功能。

所以,这俩个得结合使用来满足需求,不然一味的用1,导致,图片模糊的不行,但是尺寸还是很大

NSData *fData = UIImageJPEGRepresentation(self.photo, 0.5);
第一个参数是UIImage,第二个参数是压缩系数,他的设置并不能保证图片的大小,因为压缩之后的大小和图片的内容也有关系,比如你的图片的的颜色相似的话压缩之后图片的大小就会小点。你所在在意的wifi情况压缩图片是不是指需要上传呢,如果是需要上传的话你可以压缩两种格式的图片,高质量的和低质量的图片,有wifi的情况下上传高质量的图片,没有wifi的情况下上传低质量的图片

/**
压图片质量

@param image image
@return Data
*/
+ (NSData *)zipImageWithImage:(UIImage *)image
{
if (!image) {
return nil;
}
CGFloat maxFileSize = 32*1024;
CGFloat compression = 0.9f;
NSData *compressedData = UIImageJPEGRepresentation(image, compression);
while ([compressedData length] > maxFileSize) {
compression *= 0.9;
compressedData = UIImageJPEGRepresentation([[self class] compressImage:image newWidth:image.size.width*compression], compression);
}
return compressedData;
}

/**
*  等比缩放本图片大小
*
*  @param newImageWidth 缩放后图片宽度,像素为单位
*
*  @return self-->(image)
*/
+ (UIImage *)compressImage:(UIImage *)image newWidth:(CGFloat)newImageWidth
{
if (!image) return nil;
float imageWidth = image.size.width;
float imageHeight = image.size.height;
float width = newImageWidth;
float height = image.size.height/(image.size.width/width);

float widthScale = imageWidth /width;
float heightScale = imageHeight /height;

// 创建一个bitmap的context
// 并把它设置成为当前正在使用的context
UIGraphicsBeginImageContext(CGSizeMake(width, height));

if (widthScale > heightScale) {
[image drawInRect:CGRectMake(0, 0, imageWidth /heightScale , height)];
}
else {
[image drawInRect:CGRectMake(0, 0, width , imageHeight /widthScale)];
}

// 从当前context中创建一个改变大小后的图片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
// 使当前的context出堆栈
UIGraphicsEndImageContext();

return newImage;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: