源碼圖
下發(fā)附上源碼,方便大家研究
- (void)setThumbnailFromImage:(UIImage*)image {
CGSizeoriginImageSize = image.size;
CGRectnewRect =CGRectMake(0,0,40,40);
//根據(jù)當(dāng)前屏幕scaling factor創(chuàng)建一個(gè)透明的位圖圖形上下文(此處不能直接從UIGraphicsGetCurrentContext獲取,原因是UIGraphicsGetCurrentContext獲取的是上下文棧的頂,在drawRect:方法里棧頂才有數(shù)據(jù),其他地方只能獲取一個(gè)nil.詳情看文檔)
UIGraphicsBeginImageContextWithOptions(newRect.size,NO,0.0);
//保持寬高比例,確定縮放倍數(shù)
//(原圖的寬高做分母,導(dǎo)致大的結(jié)果比例更小,做MAX后,ratio*原圖長寬得到的值最小是40,最大則比40大,這樣的好處是可以讓原圖在畫進(jìn)40*40的縮略矩形畫布時(shí),origin可以取=(縮略矩形長寬減原圖長寬*ratio)/2 ,這樣可以得到一個(gè)可能包含負(fù)數(shù)的origin,結(jié)合縮放的原圖長寬size之后,最終原圖縮小后的縮略圖中央剛好可以對(duì)準(zhǔn)縮略矩形畫布中央)
floatratio =MAX(newRect.size.width/ originImageSize.width, newRect.size.height/ originImageSize.height);
//創(chuàng)建一個(gè)圓角的矩形UIBezierPath對(duì)象
UIBezierPath*path = [UIBezierPathbezierPathWithRoundedRect:newRectcornerRadius:5.0];
//用Bezier對(duì)象裁剪上下文
[pathaddClip];
//讓image在縮略圖范圍內(nèi)居中()
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對(duì)象,賦值給thumbnai屬性
UIImage*smallImg =UIGraphicsGetImageFromCurrentImageContext();
self.thumbnail= smallImg;
//清理圖形上下文(用了UIGraphicsBeginImageContext需要清理)
UIGraphicsEndImageContext();
}