源码图
下发附上源码,方便大家研究
- (void)setThumbnailFromImage:(UIImage*)image {
CGSizeoriginImageSize = image.size;
CGRectnewRect =CGRectMake(0,0,40,40);
//根据当前屏幕scaling factor创建一个透明的位图图形上下文(此处不能直接从UIGraphicsGetCurrentContext获取,原因是UIGraphicsGetCurrentContext获取的是上下文栈的顶,在drawRect:方法里栈顶才有数据,其他地方只能获取一个nil.详情看文档)
UIGraphicsBeginImageContextWithOptions(newRect.size,NO,0.0);
//保持宽高比例,确定缩放倍数
//(原图的宽高做分母,导致大的结果比例更小,做MAX后,ratio*原图长宽得到的值最小是40,最大则比40大,这样的好处是可以让原图在画进40*40的缩略矩形画布时,origin可以取=(缩略矩形长宽减原图长宽*ratio)/2 ,这样可以得到一个可能包含负数的origin,结合缩放的原图长宽size之后,最终原图缩小后的缩略图中央刚好可以对准缩略矩形画布中央)
floatratio =MAX(newRect.size.width/ originImageSize.width, newRect.size.height/ originImageSize.height);
//创建一个圆角的矩形UIBezierPath对象
UIBezierPath*path = [UIBezierPathbezierPathWithRoundedRect:newRectcornerRadius:5.0];
//用Bezier对象裁剪上下文
[pathaddClip];
//让image在缩略图范围内居中()
CGRectprojectRect;
projectRect.size.width= originImageSize.width* ratio;
projectRect.size.height= originImageSize.height* ratio;
projectRect.origin.x= (newRect.size.width- projectRect.size.width) /2;
projectRect.origin.y= (newRect.size.height- projectRect.size.height) /2;
//在上下文中画图
[imagedrawInRect:projectRect];
//从图形上下文获取到UIImage对象,赋值给thumbnai属性
UIImage*smallImg =UIGraphicsGetImageFromCurrentImageContext();
self.thumbnail= smallImg;
//清理图形上下文(用了UIGraphicsBeginImageContext需要清理)
UIGraphicsEndImageContext();
}