?#pragma mark - 壓縮圖片到指定大小(單位KB)
- (NSData?*)resetSizeOfImageData:(UIImage?*)sourceImage
?? ? ? ? ? ? ? ? ? ? ? ? maxSize:(NSInteger)maxSize {
?//先判斷當(dāng)前質(zhì)量是否滿足要求,不滿足再進(jìn)行壓縮
?__block?NSData?*finallImageData =?UIImageJPEGRepresentation(sourceImage,1.0);
?NSUInteger?sizeOrigin ? = finallImageData.length;
?NSUInteger?sizeOriginKB = sizeOrigin /?1000;
?if?(sizeOriginKB <= maxSize) {
?return?finallImageData;
? ? }
?//獲取原圖片寬高比
?CGFloat?sourceImageAspectRatio = sourceImage.size.width/sourceImage.size.height;
?//先調(diào)整分辨率
?CGSize?defaultSize =?CGSizeMake(1024,?1024/sourceImageAspectRatio);
?UIImage?*newImage = [self?newSizeImage:defaultSize?image:sourceImage];
finallImageData =?UIImageJPEGRepresentation(newImage,1.0);
?//保存壓縮系數(shù)
?NSMutableArray?*compressionQualityArr = [NSMutableArray?array];
?CGFloat?avg ? =?1.0/250;
?CGFloat?value = avg;
?for?(int?i =?250; i >=?1; i--) {
? ? ? ? value = i*avg;
[compressionQualityArr?addObject:@(value)];
? ? }
?/*
?? ? 調(diào)整大小
?? ? 說明:壓縮系數(shù)數(shù)組compressionQualityArr是從大到小存儲(chǔ)叽粹。
?? ? */
?//思路:使用二分法搜索
?__block?NSData?*canCompressMinData = [NSData?data];//當(dāng)無法壓縮到指定大小時(shí),用于存儲(chǔ)當(dāng)前能夠壓縮到的最小值數(shù)據(jù)眷篇。
? ? [self?halfFuntion:compressionQualityArr?image:newImage?sourceData:finallImageData?maxSize:maxSize?resultBlock:^(NSData?*finallData,?NSData?*tempData) {
? ? ? ? finallImageData = finallData;
? ? ? ? canCompressMinData = tempData;
? ? }];
?//如果還是未能壓縮到指定大小冒萄,則進(jìn)行降分辨率
?while?(finallImageData.length?==?0) {
?//每次降100分辨率
?CGFloat?reduceWidth =?100.0;
?CGFloat?reduceHeight =?100.0/sourceImageAspectRatio;
?if?(defaultSize.width-reduceWidth <=?0?|| defaultSize.height-reduceHeight <=?0) {
?break;
? ? ? ? }
defaultSize =?CGSizeMake(defaultSize.width-reduceWidth, defaultSize.height-reduceHeight);
?UIImage?*image = [self?newSizeImage:defaultSize
?image:[UIImage?imageWithData:UIImageJPEGRepresentation(newImage,[[compressionQualityArr?lastObject]?floatValue])]];
? ? ? ? [self?halfFuntion:compressionQualityArr?image:image?sourceData:UIImageJPEGRepresentation(image,1.0)?maxSize:maxSize?resultBlock:^(NSData?*finallData,?NSData?*tempData) {
? ? ? ? ? ? finallImageData = finallData;
? ? ? ? ? ? canCompressMinData = tempData;
? ? ? ? }];
? ? }
?//如果分辨率已經(jīng)無法再降低臊岸,則直接使用能夠壓縮的那個(gè)最小值即可
?if?(finallImageData.length==0) {
? ? ? ? finallImageData = canCompressMinData;
? ? }
?return?finallImageData;
}
#pragma mark 調(diào)整圖片分辨率/尺寸(等比例縮放)
///調(diào)整圖片分辨率/尺寸(等比例縮放)
- (UIImage?*)newSizeImage:(CGSize)size
? ? ? ? ? ? ? ? ? ? image:(UIImage?*)sourceImage {
?CGSize?newSize =?CGSizeMake(sourceImage.size.width, sourceImage.size.height);
?CGFloat?tempHeight = newSize.height?/ size.height;
?CGFloat?tempWidth = newSize.width?/ size.width;
?if?(tempWidth >?1.0?&& tempWidth > tempHeight) {
newSize =?CGSizeMake(sourceImage.size.width?/ tempWidth, sourceImage.size.height?/ tempWidth);
}?else?if?(tempHeight >?1.0?&& tempWidth < tempHeight) {
newSize =?CGSizeMake(sourceImage.size.width?/ tempHeight, sourceImage.size.height?/ tempHeight);
? ? }
?//? ? UIGraphicsBeginImageContext(newSize);
?UIGraphicsBeginImageContextWithOptions(newSize,?NO,?1);
[sourceImage?drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
?UIImage?*newImage =?UIGraphicsGetImageFromCurrentImageContext();
?UIGraphicsEndImageContext();
?return?newImage;
}
#pragma mark 二分法
///二分法,block回調(diào)中finallData長度不為零表示最終壓縮到了指定的大小尊流,如果為零則表示壓縮不到指定大小帅戒。tempData表示當(dāng)前能夠壓縮到的最小值。
- (void)halfFuntion:(NSArray?*)arr
? ? ? ? ? ? ? image:(UIImage?*)image
?? ? ? ? sourceData:(NSData?*)finallImageData
? ? ? ? ? ? maxSize:(NSInteger)maxSize
? ? ? ? resultBlock:(void(^)(NSData?*finallData,?NSData?*tempData))block {
?NSData?*tempData = [NSData?data];
?NSUInteger?start =?0;
?NSUInteger?end = arr.count?-?1;
?NSUInteger?index =?0;
?NSUInteger?difference =?NSIntegerMax;
?while(start <= end) {
? ? ? ? index = start + (end - start)/2;
finallImageData =?UIImageJPEGRepresentation(image,[arr[index]?floatValue]);
?NSUInteger?sizeOrigin = finallImageData.length;
?NSUInteger?sizeOriginKB = sizeOrigin /?1000;
?NSLog(@"當(dāng)前降到的質(zhì)量:%ld", (unsigned?long)sizeOriginKB);
?//? ? ? ? NSLog(@"\nstart:%zd\nend:%zd\nindex:%zd\n壓縮系數(shù):%lf", start, end, (unsigned long)index, [arr[index] floatValue]);
?if?(sizeOriginKB > maxSize) {
start = index +?1;
}?else?if?(sizeOriginKB < maxSize) {
?if?(maxSize-sizeOriginKB < difference) {
? ? ? ? ? ? ? ? difference = maxSize-sizeOriginKB;
? ? ? ? ? ? ? ? tempData = finallImageData;
? ? ? ? ? ? }
?if?(index<=0) {
?break;
? ? ? ? ? ? }
end = index -?1;
}?else?{
?break;
? ? ? ? }
? ? }
?NSData?*d = [NSData?data];
?if?(tempData.length==0) {
? ? ? ? d = finallImageData;
? ? }
?if?(block) {
? ? ? ? block(tempData, d);
? ? }
}