ios kb转m_ios压缩到指定的 KB

我的这个文章是修改简书的blog,本来想在 [作者:郑莫轩 ] 的blog 下评论,但是代码太多了,只能先用一个blog 记录下来,供大家参考。

[代码大放送--iOS图片压缩]

(http://www.jianshu.com/p/974a9537d9f7/comments/2623143#comment-2623143)

- (void)viewDidLoad {

[super viewDidLoad];

[self compressedImageFiles:[UIImage imageNamed:@"1.jpg"] imageKB:20 imageBlock:^(UIImage *image) {

}];

}

/**

* 压缩图片

*

* @param image 需要压缩的图片

* @param fImageBytes 希望压缩后的大小(以KB为单位)

*

* @return 压缩后的图片

*/

- (void)compressedImageFiles:(UIImage *)image

imageKB:(CGFloat)fImageKBytes

imageBlock:(void(^)(UIImage *image))block {

__block UIImage *imageCope = image;

CGFloat fImageBytes = fImageKBytes * 1024;//需要压缩的字节Byte

__block NSData *uploadImageData = nil;

uploadImageData = UIImagePNGRepresentation(imageCope);

NSLog(@"图片压前缩成 %fKB",uploadImageData.length/1024.0);

CGSize size = imageCope.size;

CGFloat imageWidth = size.width;

CGFloat imageHeight = size.height;

if (uploadImageData.length > fImageBytes && fImageBytes >0) {

dispatch_async(dispatch_queue_create("CompressedImage", DISPATCH_QUEUE_SERIAL), ^{

/* 宽高的比例 **/

CGFloat ratioOfWH = imageWidth/imageHeight;

/* 压缩率 **/

CGFloat compressionRatio = fImageBytes/uploadImageData.length;

/* 宽度或者高度的压缩率 **/

CGFloat widthOrHeightCompressionRatio = sqrt(compressionRatio);

CGFloat dWidth = imageWidth *widthOrHeightCompressionRatio;

CGFloat dHeight = imageHeight*widthOrHeightCompressionRatio;

if (ratioOfWH >0) { /* 宽 > 高,说明宽度的压缩相对来说更大些 **/

dHeight = dWidth/ratioOfWH;

}else {

dWidth = dHeight*ratioOfWH;

}

imageCope = [self drawWithWithImage:imageCope width:dWidth height:dHeight];

uploadImageData = UIImagePNGRepresentation(imageCope);

NSLog(@"当前的图片已经压缩成 %fKB",uploadImageData.length/1024.0);

//微调

NSInteger compressCount = 0;

/* 控制在 1M 以内**/

while (fabs(uploadImageData.length - fImageBytes) > 1024) {

/* 再次压缩的比例**/

CGFloat nextCompressionRatio = 0.9;

if (uploadImageData.length > fImageBytes) {

dWidth = dWidth*nextCompressionRatio;

dHeight= dHeight*nextCompressionRatio;

}else {

dWidth = dWidth/nextCompressionRatio;

dHeight= dHeight/nextCompressionRatio;

}

imageCope = [self drawWithWithImage:imageCope width:dWidth height:dHeight];

uploadImageData = UIImagePNGRepresentation(imageCope);

/*防止进入死循环**/

compressCount ++;

if (compressCount == 10) {

break;

}

}

NSLog(@"图片已经压缩成 %fKB",uploadImageData.length/1024.0);

imageCope = [[UIImage alloc] initWithData:uploadImageData];

dispatch_sync(dispatch_get_main_queue(), ^{

block(imageCope);

});

});

}

else

{

block(imageCope);

}

}

/* 根据 dWidth dHeight 返回一个新的image**/

- (UIImage *)drawWithWithImage:(UIImage *)imageCope width:(CGFloat)dWidth height:(CGFloat)dHeight{

UIGraphicsBeginImageContext(CGSizeMake(dWidth, dHeight));

[imageCope drawInRect:CGRectMake(0, 0, dWidth, dHeight)];

imageCope = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return imageCope;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值