目前在iOS上对于图片的优化点有很多,例如图片解码、图片渐加载和图片尺寸处理。这篇文章是说明目前iOS 代码中修改图片尺寸的两种方法,以及这两种方法区别和注意点。
修改图片尺寸的两种方法
1. 画布ImageContext(UIKit)
/** 利用画布对图片尺寸进行修改
@param data ---- 图片Data
@param maxPixelSize ---- 图片最大宽/高尺寸 ,设置后图片会根据最大宽/高 来等比例缩放图片
@return 目标尺寸的图片Image */
+ (UIImage*) getThumImgOfConextWithData:(NSData*)data withMaxPixelSize:(int)maxPixelSize
{
UIImage *imgResult = nil;
if(data == nil) { return imgResult; }
if(data.length <= 0) { return imgResult; }
if(maxPixelSize <= 0) { return imgResult; }
const int sizeTo = maxPixelSize; // 图片最大的宽/高
CGSize sizeResult;
UIImage *img = [UIImage imageWithData:data];
if(img.size.width > img.size.height){ // 根据最大的宽/高 值,等比例计算出最终目标尺寸
float value = img.size.width/ sizeTo;
int height = img.size.height / value;
sizeResult = CGSizeMake(sizeTo, height);
} else {
float value = img.size.height/ sizeTo;
int width = img.size.width / value;
sizeResult = CGSizeMake(width, sizeTo);
}
UIGraphicsBeginImageContextWithOptions(sizeResult, NO, 0);
[img drawInRect:CGRectMake(0, 0, sizeResult.width, sizeResult.height)];
img = nil;
imgResult = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return imgResult;
}
2. image I/O 创建省略图
/** Image I/O 获取指定尺寸的图片,返回的结果Image 目标尺寸大小 <= 图片原始尺寸大小
@param data ---- 图片Data
@param maxPixelSize ---- 图片最大宽/高尺寸 ,设置后图片会根据最大宽/高 来等比例缩放图片
@return 目标尺寸的图片Image */
+ (UIImage*) getThumImgOfImgIOWithData:(NSData*)data withMaxPixelSize:(int)maxPixelSize
{
UIImage *imgResult = nil;
if(data == nil) { return imgResult; }
if(data.length <= 0) { return imgResult; }
if(maxPixelSize <= 0) { return imgResult; }
const float scale = [UIScreen mainScreen].scale;
const int sizeTo = maxPixelSize * scale;
CFDataRef dataRef = (__bridge CFDataRef)data;
/* CGImageSource的键值说明
kCGImageSourceCreateThumbnailWithTransform - 设置缩略图是否进行Transfrom变换
kCGImageSourceCreateThumbnailFromImageAlways - 设置是否创建缩略图,无论原图像有没有包含