iOS开发_图片涂鸦

主控制器的关键代码:

一  ViewController.m

#import "ViewController.h"
#import "ZRPaintView.h"
#import "UIImage+ZR.h"

@interface ViewController ()

- (IBAction)clear;
- (IBAction)back;
- (IBAction)save;

@property (weak, nonatomic) IBOutlet ZRPaintView *paintView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)clear {
    [self.paintView clear];
}

- (IBAction)back {
    [self.paintView back];
}

- (IBAction)save {
    //1 截图
    UIImage *image = [UIImage captureWithView:self.paintView];
    //2 保存到图片
    UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);

}
/**
 *  保存图片操作之后就会调用
 *
 *  @param image       image
 *  @param error       error
 */
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
    if (error) {
        NSLog(@"保存失败");
    }else{
        NSLog(@"保存成功");
    }
}
@end

二  创建一个继承自UIView的子类:

ZRPaintView.h

#import <UIKit/UIKit.h>

@interface ZRPaintView : UIView

-(void)clear;

-(void)back;

@end

ZRPaintView.m

#import "ZRPaintView.h"

@interface ZRPaintView ()
@property(nonatomic,strong) NSMutableArray *totalPathPoints;

//用来记录
@property(nonatomic,strong) NSMutableArray *pathPoints;
@end

@implementation ZRPaintView

-(NSMutableArray *)totalPathPoints{
    if (!_pathPoints) {
        _pathPoints = [NSMutableArray array];
    }
    return _pathPoints;
}

-(void)clear{
    [self.totalPathPoints removeAllObjects];
    [self setNeedsDisplay];
}

-(void)back{
    [self.totalPathPoints removeLastObject];
    [self setNeedsDisplay];
}

/**
 *  确定起点
 */
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint startPos = [touch locationInView:touch.view];
    //每一次开始触摸,就新建一个数组来存放这一次触摸过程中所有点(这次触摸过程中得所有点)
    NSMutableArray *pathPoints = [NSMutableArray array];
    [pathPoints addObject:[NSValue valueWithCGPoint:startPos]];
    [self.totalPathPoints addObject:pathPoints];
    //添加这个路径中得所有点到数组中
    [self setNeedsDisplay];
}
/**
 *  连线
 */
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint currentPos = [touch locationInView:touch.view];
    //取出这次路径对应的数组
    NSMutableArray *pathPoints = [self.totalPathPoints lastObject];
    [pathPoints addObject:[NSValue valueWithCGPoint:currentPos]];

    [self setNeedsDisplay];
}
/**
 *  连线
 */
-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//    UITouch *touch = [touches anyObject];
//    CGPoint endPos = [touch locationInView:touch.view];
//
//    //取出这次路径对应的数组
//    NSMutableArray *pathPoints = [self.totalPathPoints lastObject];
//    [pathPoints addObject:[NSValue valueWithCGPoint:endPos]];
//
//    [self setNeedsDisplay];
    [self touchesMoved:touches withEvent:event];
}

- (void)drawRect:(CGRect)rect {
//    UIRectFill(CGRectMake(0, 0, 100, 100));
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    for (NSMutableArray *pathPoints in self.totalPathPoints) {
        for (int i = 0; i<pathPoints.count; i++) {//一条路径
            CGPoint pos = [pathPoints[i] CGPointValue];
            if (i==0) {
                CGContextMoveToPoint(ctx, pos.x, pos.y);
            }else{
                CGContextAddLineToPoint(ctx, pos.x, pos.y);
            }
        }
    }

    CGContextSetLineCap(ctx, kCGLineCapRound);
    CGContextSetLineJoin(ctx, kCGLineJoinRound);
    CGContextSetLineWidth(ctx, 5);
    CGContextStrokePath(ctx);
}

@end

三  创建UIImage分类文件:

UIImage+ZR.h

#import <UIKit/UIKit.h>

@interface UIImage (ZR)

+(instancetype)captureWithView:(UIView *)view;

@end

UIImage+ZR.m

#import "UIImage+ZR.h"

@implementation UIImage (ZR)

+(instancetype)captureWithView:(UIView *)view{
    //1 开启上下文
    UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0.0);
    //2 将控制器view的layer渲染到上下文
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    //3 取出图片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    //4 结束上下文
    UIGraphicsEndImageContext();

    return newImage;
}

@end
时间: 2024-10-18 06:39:35

iOS开发_图片涂鸦的相关文章

iOS开发基础-图片切换(2)

延续:iOS开发基础-图片切换(1),对(1)里面的代码进行改善. 在 ViewController 类中添加新的数组属性:  @property (nonatomic, strong) NSArray *infoArray; //存放图片信息 通过 self.infoArray 的 getter 方法对其实现初始化(懒加载),其中代码中的 _infoArray 不能用 self.infoArray 替换: 1 //infoArray的get方法 2 - (NSArray *)infoArray

iOS开发基础-图片切换(3)

延续:iOS开发基础-图片切换(2),对(2)里面的代码用属性列表plist进行改善. 新建 Property List 命名为 Data 获得一个后缀为 .plist 的文件. 按如图修改刚创建的文件: 最后,修改 infoArray 的 getter 方法: 1 //infoArray的getter方法 2 - (NSArray *)infoArray { 3 NSLog(@"需要获取图片信息数组"); 4 //只实例化一次 5 if (_infoArray == nil) { 6

iOS开发中图片方向的获取与更改

iOS开发中 再用到照片的时候  或多或少遇到过这样的问题  就是我想用的照片有横着拍的有竖着排的  所以导致我选取图片后的效果也横七竖八的   显示效果不好 比如: 图中红圈选中的图片选取的是横着拍的图片 所以显示的头像也是横着的 显示效果不佳 问题描述: 使用过iPhone或者iPad的朋友在拍照时不知是否遇到过这样的问题,将设备中的照片导出到Windows上时,经常发现导出的照片方向会有问题,要么横着,要么颠倒着,需要旋转才适合观看.而如果直接在这些设备上浏览时,照片会始终显示正确的方向,

IOS开发防止图片渲染的方法

IOS开发中,很多时候我们在给导航控制器或者其它的控制器中的部件添加图片的时候,图片会被渲染,下面就是处理图片渲染的方法. UIImage *image = [UIImage imageNamed:@"a.jpg"]; image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

iOS开发探索-图片压缩处理

介绍: 压: 指文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降.缩: 指文件的尺寸变小,也就是像素数减少,而长宽尺寸变小,文件体积同样会减小. 应用: 在实际开发中,我们经常会对图片进行处理,满足开发需求,以下介绍三种图片压缩处理: 1.压缩图片质量(图片体积减小,像素不变) 两种读取图片数据的简单方法:(1).UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数,压缩体积不是随压缩系数比例变化的.(2).UIImagePNGRepresenta

iOS开发-ScrollView图片缩放

智能手机一般常用常用的操作触摸,滑动,缩放,感觉对于生活而言就是手机在手,天下我有,看网页的时候字体太小,缩放一下,看美女的看的不爽,缩放一下,地图看的不清,缩放一下.缩放是一个很常见的操作,不论是从生活还是写程序而言,都是一个绕不开的东西,做了一个Demo,缩放一下美女,熟悉ScrollView中的常见属性的设置,开始正题吧. 常见属性 先看图,要实现的效果: UIImage *image=[UIImage imageNamed:@"girl0.jpg"]; _imageView=[

iOS开发_初识视频直播

一.使用第三方ijkPlayer框架开发直播 1.去到B站得github主页,找到ijkplayer项目,下载源码 ijkplayer下载地址 2.Demo的使用以及如何编译Demo 请移步如何快速的开发一个完整的iOS直播app(播放篇) 其实里面讲的很详细,我也是参照这个写的Demo.然后在他的基础上加了一点东西.(不废话我直接上我的代码) 先看看效果图 特点 1.纯代码Masonry布局 2.集成ijkplayer第三方库,实现拉流播放 3.打包ijkplayer静态库,实现release

iOS开发-简单图片背景替换(实现抠图效果)

之前好奇, 想实现这样的功能   -----> iOS图像处理-(jpg去除白色背景) 把一张图片(.jpg)的白色背景抠掉,转成.png 格式的有alpha通道的透明图. 原图黑白分明, 像这样转换成这样 然后在论坛,得到了想要的答案.这里先谢过那位大牛, 也提供了参考资料:iOS8 Core Image In Swift:更复杂的滤镜 然后今天, 自己也总结一下. 写了个小小的demo, 实现背景图片的切换. 效果如下: 可以看到, 原先的黄色渐变背景被替换掉了.  接下去就是要实现这样一个

iOS开发_常用的正则表达式

实现正则表达式匹配的方式 常用的正则表达式 实现正则表达式匹配的方式 iOS中有三种方式可以实现正则表达式的匹配. 1.利用NSPredicate(谓词)匹配 例如匹配有效邮箱: NSString *email = @"[email protected]"; // 邮箱的正则表达式 NSString *emailRegex = @"[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; //