cdts/xdts-ios 3/TreeHole/Code/Gategory/UIImageEx/UIImage+Scale.m
2023-07-27 09:20:00 +08:00

103 lines
3.7 KiB
Objective-C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// UIImage+Scale.m
// Meet
//
// Created by yuqingyuan on 2018/9/28.
// Copyright © 2018年 ko1o. All rights reserved.
//
#import "UIImage+Scale.h"
@implementation UIImage (Scale)
+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)size
{
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
UIGraphicsBeginImageContextWithOptions(size, NO, [[UIScreen mainScreen] scale]);
} else {
UIGraphicsBeginImageContext(size);
}
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
+ (UIImage *)imageWithImage:(UIImage *)image scaledToMaxWidth:(CGFloat)width maxHeight:(CGFloat)height
{
CGSize newSize = [self sizeWithImageSize:image.size scaledToMaxWidth:width maxHeight:height];
return [self imageWithImage:image scaledToSize:newSize];
}
+ (CGSize)sizeWithImageSize:(CGSize)size scaledToMaxWidth:(CGFloat)width maxHeight:(CGFloat)height
{
CGFloat oldWidth = size.width;
CGFloat oldHeight = size.height;
CGFloat scaleFactor = (oldWidth > oldHeight) ? width / oldWidth : height / oldHeight;
CGFloat newHeight = oldHeight * scaleFactor;
CGFloat newWidth = oldWidth * scaleFactor;
CGSize newSize = CGSizeMake(newWidth, newHeight);
return newSize;
}
NSData *comprossImageToSize(UIImage *image, int size) {
int maxLength = size; // 最大500k
//首先判断原图大小是否在要求内如果满足要求则不进行压缩over
CGFloat compression = 1;
NSData *data = UIImageJPEGRepresentation(image, compression);
if (data.length < maxLength) return UIImageJPEGRepresentation(image, 1.0);
//原图大小超过范围,先进行“压处理”,这里 压缩比 采用二分法进行处理6次二分后的最小压缩比是0.015625,已经够小了
CGFloat max = 1;
CGFloat min = 0;
for (int i = 0; i < 6; ++i) {
compression = (max + min) / 2;
data = UIImageJPEGRepresentation(image, compression);
if (data.length < maxLength * 0.9) {
min = compression;
} else if (data.length > maxLength) {
max = compression;
} else {
break;
}
}
//判断“压处理”的结果是否符合要求符合要求就over
UIImage *resultImage = [UIImage imageWithData:data];
if (data.length < maxLength) return data;
//缩处理,直接用大小的比例作为缩处理的比例进行处理,因为有取整处理,所以一般是需要两次处理
NSUInteger lastDataLength = 0;
while (data.length > maxLength && data.length != lastDataLength) {
lastDataLength = data.length;
//获取处理后的尺寸
CGFloat ratio = (CGFloat)maxLength / data.length;
CGSize size = CGSizeMake((NSUInteger)(resultImage.size.width * sqrtf(ratio)),
(NSUInteger)(resultImage.size.height * sqrtf(ratio)));
//通过图片上下文进行处理图片
UIGraphicsBeginImageContext(size);
[resultImage drawInRect:CGRectMake(0, 0, size.width, size.height)];
resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//获取处理后图片的大小
data = UIImageJPEGRepresentation(resultImage, compression);
}
return data;
}
NSData *compressImageToDataIfNeed(UIImage *image)
{
return comprossImageToSize(image, 500 * 1000);
}
UIImage *compressImageToSizeIfNeed(UIImage *image, int size)
{
NSData *data = comprossImageToSize(image, size);
return [[UIImage alloc] initWithData:data];
}
@end