压缩图片

本文介绍了一个UIImage的分类扩展方法,用于实现图片的压缩功能。该方法包括UIImage的压缩、压缩质量的计算以及压缩后的数据导出等功能。通过设定最大像素值和最大数据长度限制,可以有效地减小图片尺寸。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


@interface UIImage (Compress)

- (UIImage *)compressedImage;

- (CGFloat)compressionQuality;

- (NSData *)compressedData;

- (NSData *)compressedData:(CGFloat)compressionQuality;

@end



#define MAX_IMAGEPIX 200.0 // max pix 200.0px
#define MAX_IMAGEDATA_LEN 50000.0 // max data length 5K

@implementation UIImage (Compress)

- (UIImage *)compressedImage {
CGSize imageSize = self.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;

if (width <= MAX_IMAGEPIX && height <= MAX_IMAGEPIX) {
// no need to compress.
return self;
}

if (width == 0 || height == 0) {
// void zero exception
return self;
}

UIImage *newImage = nil;
CGFloat widthFactor = MAX_IMAGEPIX / width;
CGFloat heightFactor = MAX_IMAGEPIX / height;
CGFloat scaleFactor = 0.0;

if (widthFactor > heightFactor)
scaleFactor = heightFactor; // scale to fit height
else
scaleFactor = widthFactor; // scale to fit width

CGFloat scaledWidth = width * scaleFactor;
CGFloat scaledHeight = height * scaleFactor;
CGSize targetSize = CGSizeMake(scaledWidth, scaledHeight);

UIGraphicsBeginImageContext(targetSize); // this will crop

CGRect thumbnailRect = CGRectZero;
thumbnailRect.size.width = scaledWidth;
thumbnailRect.size.height = scaledHeight;

[self drawInRect:thumbnailRect];

newImage = UIGraphicsGetImageFromCurrentImageContext();

//pop the context to get back to the default
UIGraphicsEndImageContext();

return newImage;

}

- (NSData *)compressedData:(CGFloat)compressionQuality {
assert(compressionQuality <= 1.0 && compressionQuality >= 0);

return UIImageJPEGRepresentation(self, compressionQuality);
}

- (CGFloat)compressionQuality {
NSData *data = UIImageJPEGRepresentation(self, 1.0);
NSUInteger dataLength = [data length];

if(dataLength > MAX_IMAGEDATA_LEN) {
return 1.0 - MAX_IMAGEDATA_LEN / dataLength;
} else {
return 1.0;
}
}

- (NSData *)compressedData {
CGFloat quality = [self compressionQuality];

return [self compressedData:quality];
}

@end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值