iOS_Quartz2D_图片裁剪

展示效果:


iOS_Quartz2D_图片裁剪_第1张图片
效果图


iOS_Quartz2D_图片裁剪_第2张图片
效果图


iOS_Quartz2D_图片裁剪_第3张图片
效果图


iOS_Quartz2D_图片裁剪_第4张图片
效果图

请问:实现的步骤是什么?

第一步,需求:需要把一张普通的图片可以裁剪成圆形显示,.请问:图片裁减的思路是什么?

l1>在上下文中绘制一个要裁剪的图形.

l2>调用void

CGContextClip(CGContextRef c)进行裁剪.裁剪的意思就是告诉系统,将来只有在被裁剪出的区域内绘制的图形才会显示.

l3>在裁剪好的上下文中再把图片绘制上去.直接调用UIImage对象的绘图方法即可!注意:绘制图片的时候,必须绘制到已经裁剪出的图形位置,否则不显示.

第二步,实现图片正方形裁剪,以圆形进行显示,最终生成一张新的图片.并保存到沙盒中.请问:实现的步骤是什么?

l1>先加载原图.

l2>创建(开启)一个和原图一样大小的“位图上下文”

l3>获取刚才开启的图形上下文

l4>执行裁剪操作

l4.1>向上下文中绘制一个圆

l4.2>把路径添加到上下文中

l4.3>执行裁剪操作

l5>把图片绘制到上下文中

l6>从上下文中获取裁剪好的图片对象

l6.2>关闭位图上下文

l7>将新生成的图片上下文裁剪成正方形

l7.1>计算出要裁剪的矩形区域

l7.2>将点转换成像素

l7.3>调用CGImage对应的方法执行裁剪

l7.4>释放CGImage对象

l8>把图片保存到沙盒中

l8.1>获取沙盒路径

l8.2>将UIImage转换为一个NSData对象

l8.3>把图片二进制数据写入到沙盒文件中

第三步,再裁剪一个外层带圆环的图片.

l1>先加载原图.

l2>创建(开启)一个和原图一样大小的“位图上下文”

l3>获取刚才开启的图形上下文

l4>先绘制一个圆环,然后渲染

l5>将路径添加到上下文中并进行渲染

l6>再绘制一个要裁剪的圆

l7>从上下文中获取图片

l8>关闭上下文

l9>将上下文裁剪成正方形

l10>调用CGImage对应的方法执行裁剪

l10.1>释放CGImage对象

l11>将图片保存到沙盒中

//第一步代码实现

------------------------------ HMDrawingView.m------------------------------

- (void)drawRect:(CGRect)rect {

// 1.加载要裁剪的图片

UIImage*image = [UIImageimageNamed:@"me"];

// 2.获取上下文

CGContextRefctx =UIGraphicsGetCurrentContext();

// 3.在上下文中绘制一个要裁剪的图形

UIBezierPath*pathCircle = [UIBezierPathbezierPathWithOvalInRect:CGRectMake(0,0,100,100)];

CGContextAddPath(ctx, pathCircle.CGPath);

// 4.执行裁剪

CGContextClip(ctx);

// 5.把图片绘制到上下文中

[imagedrawAtPoint:CGPointZero];

}

//第二步代码实现

------------------------------ ViewController.m------------------------------

//点击了裁剪图片按钮

- (IBAction)didClickButton {

// 1.先加载原图

UIImage*img = [UIImageimageNamed:@"header"];

// 2.创建(开启)一个和原图一样大小的"位图上下文"

//参数1 ->图形上下文的大小(单位是点)参数2 ->是否不透明参数3 ->一个点表示几个像素

UIGraphicsBeginImageContextWithOptions(img.size,NO,0.0);

// 3.获取刚才开启的图形上下文

CGContextRefctx =UIGraphicsGetCurrentContext();

// 4.执行裁剪操作

// 4.1向上下文中绘制一个圆

CGPointcenterP =CGPointMake(img.size.width*0.5, img.size.height*0.5);

CGFloatradius =MIN(img.size.width*0.5, img.size.height*0.5);

UIBezierPath*path = [UIBezierPathbezierPathWithArcCenter:centerPradius:radiusstartAngle:0endAngle:M_PI*2clockwise:YES];

// 4.2把路径添加到上下文中

CGContextAddPath(ctx, path.CGPath);

// 4.3执行裁剪操作

CGContextClip(ctx);

// 5.把图片绘制到上下文中

[imgdrawAtPoint:CGPointZero];

// 6.从上下文中获取裁剪好的图片对象

UIImage*imgCliped =UIGraphicsGetImageFromCurrentImageContext();

// 6.2关闭位图上下文

UIGraphicsEndImageContext();

// 7.将新生成的图片上下文裁剪成正方形

// 7.1计算出要裁剪的矩形区域

CGFloatclipX = (img.size.width- (radius *2)) *0.5;

CGFloatclipY = (img.size.height- (radius *2)) *0.5;

CGFloatclipW = radius *2;

CGFloatclipH = clipW;

// 7.2将点转换成像素

CGFloatscale = [UIScreenmainScreen].scale;

clipX = clipX *scale;

clipY *= scale;

clipW *= scale;

clipH *= scale;

CGRectclipedRect =CGRectMake(clipX, clipY, clipW,clipH);

// 7.3调用CGImage对应的方法执行裁剪

CGImageRefcgImageCliped =CGImageCreateWithImageInRect(imgCliped.CGImage, clipedRect);

//把CGImage转换成UIImage对象

imgCliped = [UIImageimageWithCGImage:cgImageCliped];

// 7.4释放CGImage对象

CGImageRelease(cgImageCliped);

// 8.把图片保存到沙盒中

// 8.1获取沙盒路径

NSString*fileName = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject]stringByAppendingPathComponent:@"cliped.png"];

// 8.2把UIImage转换为一个NSData对象

NSData*imgData =UIImagePNGRepresentation(imgCliped);

// 8.3把图片二进制数据写入到沙盒文件中

[imgDatawriteToFile:fileNameatomically:YES];

NSLog(@"%@", fileName);

}

//第三步代码实现

------------------------------ ViewController.m------------------------------

//裁剪一个带圆环的图片

- (IBAction)didClickButton {

// 1.加载原图

UIImage*img = [UIImageimageNamed:@"dst2"];

// 2.创建一个和原图一样大小的位图上下文

UIGraphicsBeginImageContextWithOptions(img.size,NO,0.0);

// 3.获取上下文

CGContextRefctx =UIGraphicsGetCurrentContext();

// 4.先绘制一个圆环,然后渲染

//线宽

CGFloatlineWidth =10;

CGPointcenterP =CGPointMake(img.size.width*0.5, img.size.height*0.5);

CGFloatradius =MIN(img.size.width*0.5, img.size.height*0.5) - lineWidth *0.5;

UIBezierPath*path = [UIBezierPathbezierPathWithArcCenter:centerPradius:radiusstartAngle:0endAngle:M_PI*2clockwise:YES];

CGContextSetLineWidth(ctx, lineWidth);

[[UIColorredColor]set];

// 5.将路径添加到上下文中并进行渲染

CGContextAddPath(ctx, path.CGPath);

CGContextDrawPath(ctx,kCGPathStroke);

// 6.再绘制一个要裁剪的圆

// 6.1创建一个圆路径

UIBezierPath*pathCircleClip = [UIBezierPathbezierPathWithArcCenter:centerPradius:radiusstartAngle:0endAngle:M_PI*2clockwise:YES];

// 6.2把路径添加到上下文中

CGContextAddPath(ctx, pathCircleClip.CGPath);

// 6.3执行裁剪

CGContextClip(ctx);

// 6.4把图片绘制到上下文中

[imgdrawAtPoint:CGPointZero];

// 7.从上下文中获取图片

UIImage*imageCliped =UIGraphicsGetImageFromCurrentImageContext();

// 8.关闭上下文

UIGraphicsEndImageContext();

// 9.将上下文裁剪成正方形

CGFloatclipX = (img.size.width- ((radius +

(lineWidth *0.5)) *2)) *0.5;

CGFloatclipY = (img.size.height- ((radius +

(lineWidth *0.5)) *2)) *0.5;

CGFloatclipW = (radius +

(lineWidth *0.5)) *2;

CGFloatclipH = clipW;

// 9.2把点转换成像素

CGFloatscale = [UIScreenmainScreen].scale;

clipX *= scale;

clipY *= scale;

clipW *= scale;

clipH *= scale;

CGRectclipedRect =CGRectMake(clipX, clipY, clipW,clipH);

// 10.调用CGImage对应的方法执行裁剪

CGImageRefcgImageCliped =CGImageCreateWithImageInRect(imageCliped.CGImage, clipedRect);

imageCliped = [UIImageimageWithCGImage:cgImageCliped];

// 10.1释放CGImage对象

CGImageRelease(cgImageCliped);

// 11.将图片保存到沙盒中

// 11.1获取沙盒路径

NSString*fileName = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject]stringByAppendingPathComponent:@"loop_cliped03.png"];

// 11.2把UIImage转换为一个NSData对象

NSData*imageData =UIImagePNGRepresentation(imageCliped);

// 11.3将图片二进制数据写入到文件中

[imageDatawriteToFile:fileNameatomically:YES];

NSLog(@"%@",fileName);

}

你可能感兴趣的:(iOS_Quartz2D_图片裁剪)