最近项目中用到七牛上传图片,多张上传时,png图片大,上传极慢,特地研究了一下图片压缩的方法。
两种压缩图片的方法:压缩图片质量(Quality),压缩图片尺寸(Size)
压缩图片质量
NSData *data = UIImageJPEGRepresentation(image, compression);
UIImage*resultImage = [UIImageimageWithData:data];
通过 UIImage 和 NSData 的相互转化,减小 JPEG 图片的质量来压缩图片。UIImageJPEGRepresentation:: 第二个参数 compression 取值 0.0~1.0,值越小表示图片质量越低,图片文件自然越小。
压缩图片尺寸
UIGraphicsBeginImageContext(size);
[image drawInRect:CGRectMake(0,0, size.width, size.height)];
resultImage =UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();
给定所需的图片尺寸 size,resultImage 即为原图 image 绘制为 size 大小的图片。
OK,现在说一下我的压缩思路。
第一步,先等比压缩图片尺寸。根据图片的宽高,过宽度>1000就压缩到1000。
if (image.size.width > 1000) {
CGSize size = CGSizeMake(1000, 1000*image.size.height/image.size.width);
UIGraphicsBeginImageContext(size);
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
经过这一步,图片大小就压缩了一大半了。例如:我从手机随便上传的一张图片就有5M~6M,等比缩小后就只剩1M多点。
第二步,压缩图片的质量。
data = UIImageJPEGRepresentation(image, 1.0);
if (data.length > 100*1024) {
if (data.length > 1024*1024) {
//1M以及以上
data = UIImageJPEGRepresentation(image, 0.5);
}else if (data.length > 512*1024) {
//0.5M-1M
data = UIImageJPEGRepresentation(image, 0.6);
}else if (data.length > 200*1024) {
//0.25M-0.5M
data = UIImageJPEGRepresentation(image, 0.7);
}
}
if (UIImagePNGRepresentation(image) == nil) {
typeName = @"jpg";
}else{
typeName = @"png";
}
先用这个方法UIImageJPEGRepresentation将图片转成nsdata,然后根据data的length.
最后,如果你想判断不同图片的类型,可用下面的方法。
通过二进制判断图片的类型
+ (NSString *)typeForImageData:(NSData *)data {
uint8_t c;
[data getBytes:&c length:1];
switch (c) {
case 0xFF:
return @"image/jpeg";
case 0x89:
return @"image/png";
case 0x47:
return @"image/gif";
case 0x49:
case 0x4D:
return @"image/tiff";
}
return nil;
}
至此,图片压缩就完成了,谢谢~