UIImage+YYWebImage是YYWebImage(https://github.com/ibireme/YYWebImage)中的一個分類,這個分類封裝了一些image常用的變化方法,非常值得學習下源碼~(我看的版本是1.0.5) 預備知識: 1,這裡大量使用了CoreGraphics的方 ...
UIImage+YYWebImage是YYWebImage(https://github.com/ibireme/YYWebImage)中的一個分類,這個分類封裝了一些image常用的變化方法,非常值得學習下源碼~(我看的版本是1.0.5) 預備知識: 1,這裡大量使用了CoreGraphics的方法,第一個非常常用的的方法就是 UIKIT_EXTERN void UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale) NS_AVAILABLE_IOS(4_0); 蘋果的官方文檔在這兒 https://developer.apple.com/reference/uikit/1623912-uigraphicsbeginimagecontextwitho
Parameters
size
-
The size (measured in points) of the new bitmap context. This represents the size of the image returned by the
UIGraphicsGetImageFromCurrentImageContext()
function. To get the size of the bitmap in pixels, you must multiply the width and height values by the value in thescale
parameter. opaque
-
A Boolean flag indicating whether the bitmap is opaque. If you know the bitmap is fully opaque, specify
true
to ignore the alpha channel and optimize the bitmap’s storage. Specifyingfalse
means that the bitmap must include an alpha channel to handle any partially transparent pixels. scale
-
The scale factor to apply to the bitmap. If you specify a value of
0.0
, the scale factor is set to the scale factor of the device’s main screen.
corners:(UIRectCorner)corners
borderWidth:(CGFloat)borderWidth
borderColor:(UIColor *)borderColor borderLineJoin:(CGLineJoin)borderLineJoin; 設置圓角的方法 裡面用了 CGContextDrawImage(context, rect, self.CGImage);的方法;而CGContext的坐標系與UIKit的坐標系是不同的,所以需要特殊處理下; 具體有什麼不同可以參考 http://blog.csdn.net/trandy/article/details/6617272 這裡他用了修改坐標系的方法來解決,所以corners也是顛倒的,需要特殊處理下; 註意這個方法只會設置圓角,如果原來的圖片不是正方形的,那怎麼設置頁不會得到正圓的圖片,需要預先把圖片裁成正方形的才行; 7, - (nullable UIImage *)yy_imageByRotate:(CGFloat)radians fitSize:(BOOL)fitSize;生成旋轉指定角度後的圖片 fitSize傳yes,圖片會自動壓縮使圖片顯示完整,傳no圖片會被截斷; 其中 CGRectApplyAffineTransform返回的是“包含旋轉後的rect的最小矩形的CGRect”,origin的值可能為負值; 這個方法使用 CGBitmapContextCreate這個方法來繪製的,跟前面的直接用 UIGraphicsGetCurrentContext不太一樣,反正我是不太懂。。。 我能看懂的就這麼幾句: CGContextTranslateCTM(context, +(newRect.size.width * 0.5), +(newRect.size.height * 0.5)); CGContextRotateCTM(context, radians);
CGContextDrawImage(context, CGRectMake(-(width * 0.5), -(height * 0.5), width, height), self.CGImage);
CGImageRef imgRef = CGBitmapContextCreateImage(context);
UIImage *img = [UIImageimageWithCGImage:imgRef scale:self.scaleorientation:self.imageOrientation]; CGImageRelease(imgRef); 這裡比較巧妙,貌似CGContext的錨點是在(0,0)的,而image的錨點是在中心點的,所以先移動context到中心點,再從(-(width * 0.5), -(height * 0.5))開始繪圖,然後得到CGImageRef,用[UIImageimageWithCGImage:imgRef scale:self.scaleorientation:self.imageOrientation]這個方法來修正坐標系的問題,也是非常值得學習~ 8,- (nullable UIImage *)yy_imageByBlurRadius:(CGFloat)blurRadius tintColor:(nullable UIColor *)tintColor tintMode:(CGBlendMode)tintBlendMode saturation:(CGFloat)saturation maskImage:(nullable UIImage *)maskImage; 圖片模糊效果 好用,但實現超出了目前的我的理解範圍,待研究。。。 9, + (nullableUIImage *)yy_imageWithSmallGIFData:(NSData *)data scale:(CGFloat)scale; 文檔說是小型gif用,比如表情~實現沒有看懂,待研究。。。