iOS 圖片處理之任意路徑剪切

思路分析:
第一想法:
首先CGContextMoveToPoint起始點
然后使用CGContextAddLineToPoint使用給添加點
畫完以后CGContextAddLineToPoint起始點閉合路徑
使用CGContextClip方法剪切上下文
將圖片繪制到上下文
我們使用該想法去實現過程中發現以下問題
UIGraphicsBeginImageContextWithOptions方法開啟一個上下文
參數是CGSize,所以直接繪圖的得到的位置是錯誤的
解決方案:
我們首先獲取路徑所在的矩形區域
使用 CGContextDrawImage(context, myRect, imageRef),將該區域的圖片繪制到區域中!
獲取到矩形區域的圖片
然后重新開啟一個獲取到的矩形區域的上下文
添加閉合路徑
剪切上下文,繪制得到正確的圖片
注意事項:使用UIGraphicsBeginImageContextWithOptions開啟上下文的時候指定scale參數為self.image.scale否則會有問題

/*
 *  penPaths NSMutableArray 存儲 CGPoint生成的NSValue
 *  rect CGPoints的范圍
 */
- (UIImage *)clipAnyShapeImageAtPath:(NSMutableArray *)penPaths
                              atRect:(CGRect)rect {
    // 防止線畫出UIImageView范圍之外
    CGFloat width= self.frame.size.width;
    CGFloat rationScale = (width / self.image.size.width);
    CGFloat origX = (rect.origin.x - self.frame.origin.x) / rationScale;
    CGFloat origY = (rect.origin.y - self.frame.origin.y) / rationScale;
    CGFloat oriWidth = rect.size.width / rationScale;
    CGFloat oriHeight = rect.size.height / rationScale;
    
    if (origX < 0) {
        oriWidth = oriWidth + origX;
        origX = 0;
    }
    
    if (origY < 0) {
        oriHeight = oriHeight + origY;
        origY = 0;
    }
    
    // 繪制圖片到點的矩形范圍內
    CGRect myRect = CGRectMake(origX, origY, oriWidth, oriHeight);
    CGImageRef  imageRef = CGImageCreateWithImageInRect(self.image.CGImage, myRect);
    
    UIGraphicsBeginImageContextWithOptions(myRect.size, NO, self.image.scale);
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGContextDrawImage(context, myRect, imageRef);
    UIImage * newImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    UIGraphicsEndImageContext();
    
    // 任意形狀截取圖片
    // clip any path
    for (int i = 0; i < penPaths.count; i++) {
        NSValue *valueI = penPaths[i];
        CGPoint pointI = [valueI CGPointValue];
        pointI.x -= myRect.origin.x;
        pointI.y -= myRect.origin.y;
        
        if (pointI.x < 0) {
            pointI.x = 0;
        }
        
        if (pointI.y < 0) {
            pointI.x = 0;
        }
        
        penPaths[i] = [NSValue valueWithCGPoint:pointI];
    }
    
    UIGraphicsBeginImageContextWithOptions(rect.size, NO, self.image.scale);
    context = UIGraphicsGetCurrentContext();
    NSValue *value0 = penPaths[0];
    CGPoint point0 = [value0 CGPointValue];
    CGContextMoveToPoint(context, point0.x, point0.y);
    
    for (int i = 1; i < penPaths.count; i++) {
        NSValue *valueI = penPaths[i];
        CGPoint pointI = [valueI CGPointValue];
        CGContextAddLineToPoint(context, pointI.x, pointI.y);
    }
    CGContextAddLineToPoint(context, point0.x, point0.y);
    CGContextClip(context);
    [newImage drawInRect:CGRectMake(0, 0, rect.size.width, rect.size.height)];
    CGContextDrawPath(context, kCGPathFill);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return image;
}
跪求Star
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Core Graphics Framework是一套基于C的API框架,使用了Quartz作為繪圖引擎。它提供了低...
    ShanJiJi閱讀 1,581評論 0 20
  • 這幾天氣溫很低。 一般小樹七點多就醒了。現在她醒來會叫媽媽,如果餓了就會說:麻蒙麻蒙。 醒來的時候,她會說很多話,...
    應童閱讀 2,535評論 1 54
  • 長久以來我認為自己是讀書人,每天都看微博、微信公眾號,也會仔細閱讀當當讀書或微信讀書的推薦書,但僅僅是了解了作者的...
    兔媽媽1503閱讀 857評論 4 25
  • 目錄 上一章 有德無仁 第二十一章 招親比武 臺上,一男一女打斗正酣,男子二十七八的年紀,赤面濃眉,體型敦實,...
    jrskyfly閱讀 576評論 2 4