图像、动画

一种优秀的 IOS 缩略图生成方案

2015-12-26  本文已影响2042人  Cocos543

源码图

下发附上源码,方便大家研究

- (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();

}

上一篇 下一篇

猜你喜欢

热点阅读