在iOS开发的Quartz2D使用中实现图片剪切和截屏功能

2016-02-19 10:41 33 1 收藏

今天图老师小编要跟大家分享在iOS开发的Quartz2D使用中实现图片剪切和截屏功能,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

【 tulaoshi.com - 编程语言 】

图片剪切
一、使用Quartz2D完成图片剪切
1.把图片显示在自定义的view中
先把图片绘制到view上。按照原始大小,把图片绘制到一个点上。
代码:
代码如下:

- (void)drawRect:(CGRect)rect
{
    UIImage *image2=[UIImage imageNamed:@"me"];
    [image2 drawAtPoint:CGPointMake(100, 100)];
}

显示:

2.剪切图片让图片圆形展示
思路:先画一个圆,让图片显示在圆的内部,超出的部分不显示。

注意:显示的范围只限于指定的剪切范围,无论往上下文中绘制什么东西,只要超出了这个范围的都不会显示。
代码:
代码如下:

- (void)drawRect:(CGRect)rect
{
    //画圆,以便以后指定可以显示图片的范围
    //获取图形上下文
    CGContextRef ctx=UIGraphicsGetCurrentContext();
    CGContextAddEllipseInRect(ctx, CGRectMake(100, 100, 50, 50));
   
    //指定上下文中可以显示内容的范围就是圆的范围
    CGContextClip(ctx);
    UIImage *image2=[UIImage imageNamed:@"me"];
    [image2 drawAtPoint:CGPointMake(100, 100)];
}

显示:

3.剪切图片让图片三角形展示
代码:
代码如下:

- (void)drawRect:(CGRect)rect
{

    //画三角形,以便以后指定可以显示图片的范围
    //获取图形上下文
    CGContextRef ctx=UIGraphicsGetCurrentContext();
//    CGContextAddEllipseInRect(ctx, CGRectMake(100, 100, 50, 50));
    CGContextMoveToPoint(ctx, 100, 100);
    CGContextAddLineToPoint(ctx, 60, 150);
     CGContextAddLineToPoint(ctx, 140, 150);
    CGContextClosePath(ctx);
   
   
    //注意:指定范围(也就是指定剪切的方法一定要在绘制范围之前进行调用)
    //指定上下文中可以显示内容的范围就是圆的范围
    CGContextClip(ctx);
    UIImage *image2=[UIImage imageNamed:@"me"];
    [image2 drawAtPoint:CGPointMake(100, 100)];
}

显示:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

截屏
一、简单说明

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

在程序开发中,有时候需要截取屏幕上的某一块内容,比如捕鱼达人游戏。如图:

二、代码示例

  storyboard界面搭建

代码:
代码如下:

//
//  YYViewController.m
//  01-截屏
//
//  Created by apple on 14-6-12.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"
#import "MBProgressHUD+NJ.h"

@interface YYViewController ()
@property (weak, nonatomic) IBOutlet UIView *contentView;
- (IBAction)BtnClick:(UIButton *)sender;

@end

代码如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (IBAction)BtnClick:(UIButton *)sender {
   
    //延迟两秒保存
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        //获取图形上下文
        //    UIGraphicsBeginImageContext(self.view.frame.size);
        UIGraphicsBeginImageContext(self.contentView.frame.size);
        //将view绘制到图形上下文中
       
        //    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
        [self.contentView.layer renderInContext:UIGraphicsGetCurrentContext()];
    
       
        //将截屏保存到相册
        UIImage *newImage=UIGraphicsGetImageFromCurrentImageContext();
       
        UIImageWriteToSavedPhotosAlbum(newImage,self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
    });
}

 - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
    if (error) {
        [MBProgressHUD showError:@"保存失败,请检查是否拥有相关的权限"];
    }else
    {
//        [MBProgressHUD showMessage:@"保存成功!"];
        [MBProgressHUD showSuccess:@"保存成功!"];
    }
}

@end

把截取的图片保存到手机的相册中:

说明:把整个屏幕画到一张图片里
1.创建一个bitmap的上下文
2.将屏幕绘制带上下文中
3.从上下文中取出绘制好的图片
4.保存图片到相册
补充:把图片写入到文件的代码
代码如下:

//3.从上下文中取出绘制好的图片
     UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    
     NSData *data = UIImagePNGRepresentation(newImage);
    
     NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"abc.png"];
     NSLog(@"%@", path);
     [data writeToFile:path atomically:YES];

三、补充
保存成功和保存失败之后应该做些事情?
系统推荐的方法:
代码如下:

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
    if (error) {
        [MBProgressHUD showError:@"保存失败,请检查是否拥有相关的权限"];
    }else
    {
//        [MBProgressHUD showMessage:@"保存成功!"];
        [MBProgressHUD showSuccess:@"保存成功!"];
    }
}

如果图片成功保存的话,那么就提示保存成功。
如果保存失败,那么提示失败
提示:保存失败常见有两个原因:1是内存不够,2是手机内部的权限不允许。
说明:如果当一个应用程序想要访问通讯录或相册,用户已经明确拒绝过,那么以后再要访问的话会直接拒绝。这个时候,可以提示用户去开启权限。

来源:http://www.tulaoshi.com/n/20160219/1595465.html

延伸阅读
发送邮件 1.导入库文件:MessageUI.framework 2.引入头文件 3.实现代理MFMailComposeViewControllerDelegate 和 UINavigationControllerDelegate 代码示例:代码如下: - (void)didClickSendEmailButtonAction{        if ([MFMailComposeViewController canSendMail] == YES) {      &...
一、知识点简单介绍 1.UIScrollView控件是什么? (1)移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限 (2)当展⽰示的内容较多,超出⼀一个屏幕时,⽤用户可通过滚动⼿手势来查看屏幕以外的内容 (3)普通的UIView不具备滚动功能,不能显⽰示过...
实现UItableview控件数据刷新 一、项目文件结构和plist文件 二、实现效果 1.说明:这是一个英雄展示界面,点击选中行,可以修改改行英雄的名称(完成数据刷新的操作). 运行界面: 点击选中行: 修改数据后自动刷新: 三、代码示例 数据模型部分: YYheros.h文件 代码如下: // //  YYheros.h //  10-英...
使用稻草人便民工具的截屏功能   在Windows系统中,不安装第三方软件倒是也可以截屏:点击PrScrn可以截屏,在Windows自带的画图中点击Ctrl+V,这样将获得的是整个屏幕的图片;同理,使用Alt+PrScrn这个组合键截屏,获得的结果是当前窗口的图片。但是,这样的截屏无法控制大小,也无法直接获得图片,并不是十分方便。 还有很多人都...
首先我们看一下它的view层级图: 代码如下: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  {      self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];      // Override point for cus...

经验教程

684

收藏

18
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部