iOS画像編集——落書き


iOS画像編集前に話しました.
画像の拡大縮小回転: http://blog.csdn.net/lwjok2007/article/details/50845510
フィルタ:http://blog.csdn.net/lwjok2007/article/details/50853878
次に私達は絵の落書きについて話します.少しずつ広げて、まず絵に線を引きます.
プロジェクトの名前はtestAddlineです.
iOS 图片编辑——涂鸦_第1张图片
iOS 图片编辑——涂鸦_第2张图片
次にデフォルトで生成したView Controllerに画像を追加します.
ボタンを同時に追加します. 
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    UIImageView *imageV = [[UIImageView alloc]initWithFrame:CGRectMake(10, 120, screen_Width-20, screen_Height-150)];
    imageV.image = [UIImage imageNamed:@"640-960-1.jpg"];
    [self.view addSubview:imageV];
    
    UIButton *testBtn = [[UIButton alloc]initWithFrame:CGRectMake(screen_Width/2.0-60, 60, 120, 36)];
    [testBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [testBtn setTitle:@"    " forState:UIControlStateNormal];
    [testBtn addTarget:self action:@selector(addLineAct:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:testBtn];
}

- (void)addLineAct:(id)sender{
    NSLog(@"    ");
}
次にUIViewを作成して、直線的な名前を付けます.DrawLine.
iOS 图片编辑——涂鸦_第3张图片
iOS 图片编辑——涂鸦_第4张图片
いくつかの変数を作成
@property(nonatomic,strong) NSMutableArray * completeLines; //            
@property(nonatomic,strong) NSMutableDictionary* LinesInProscess; //           
@property(nonatomic,strong) UIColor *lineColor;//    
@property (nonatomic)float lineWidth;//     
初期化DrawLine
//   
- (id)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
        //     
        _completeLines = [[NSMutableArray alloc]init];
        _LinesInProscess = [[NSMutableDictionary alloc]init];
        //      
        self.backgroundColor = [UIColor clearColor];
        
    }
    
    return  self;
}
私たちは線を単独で抽象的に作成して、クラスの作成対象を名前をつけます.
iOS 图片编辑——涂鸦_第5张图片
iOS 图片编辑——涂鸦_第6张图片
線の2つの属性の開始点の終了点(これは数学の2点で直線を決定します) 
Lineクラスに2つの属性を作成します.
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface Line : NSObject

@property(nonatomic)CGPoint begin; //     

@property(nonatomic)CGPoint end; //     

@end
次に私達はDrawLineのを書き直します. drawRect方法 線を引く
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
    
    //     
    CGContextRef cgt=UIGraphicsGetCurrentContext();
    //      
    CGContextSetLineWidth(cgt, self.lineWidth);
    //           
    CGContextSetLineCap(cgt, kCGLineCapRound);
    
    //    
    [self.lineColor set];
    //         
    for (Line *line in _completeLines){
        CGContextMoveToPoint(cgt, [line begin].x, [line begin].y);
        CGContextAddLineToPoint(cgt, [line end].x, [line end].y );
        CGContextStrokePath(cgt);
    }
    
    
    //        
    for (NSArray *v in _LinesInProscess) {
        Line *line =[_LinesInProscess objectForKey:v];
        CGContextMoveToPoint(cgt, [line begin].x, [line begin].y);
        CGContextAddLineToPoint(cgt, [line end].x, [line end].y );
        CGContextStrokePath(cgt);
    }
    
}
いくつかの指の滑りを実現して、指の位置を受けて線を引く.
//    
-(void)clearAll
{
    [_completeLines removeLastObject];
    [_LinesInProscess removeAllObjects];
    [self setNeedsDisplay];
}


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //      
    for (UITouch *t in touches) {
        if ([t tapCount]>1) {
            //                   
            [self clearAll];
            return;
        }
        
        //NSValue      
        NSValue *key=[NSValue valueWithNonretainedObject:t];
        
        //         Line  
        CGPoint loc=[t locationInView:self];
        Line *newLine=[[Line alloc]init ];
        newLine.begin=loc;
        newLine.end=loc;
        //            
        [_LinesInProscess setObject:newLine forKey:key];
        
    }
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    //                      
    for (UITouch * t in touches) {
        NSValue *key=[NSValue valueWithNonretainedObject:t];
        //      UITouch   Line  
        Line *line =[_LinesInProscess objectForKey:key];
        
        CGPoint loc=[t locationInView:self];
        line.end=loc;
    }
    [self setNeedsDisplay];
}

-(void)endTouches:(NSSet *) touches
{
    //             _completeLines           _LinesInProscess    
    for (UITouch *t in touches) {
        NSValue *key=[NSValue valueWithNonretainedObject:t];
        Line *line =[_LinesInProscess objectForKey:key];
        if (line) {
            [_completeLines addObject:line];
            [_LinesInProscess removeObjectForKey:key];
        }
    }
    [self setNeedsDisplay];
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self endTouches:touches];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self endTouches:touches];
}
View Controllerに戻ってボタンを押してイベントにDrawLineを追加してImageViewに行きます.
- (void)addLineAct:(id)sender{
    NSLog(@"    ");
    
    DrawLine *touchdrawView = [[DrawLine alloc]initWithFrame:imageV.frame];

    touchdrawView.lineColor = [UIColor yellowColor];
    touchdrawView.lineWidth = 5.0;
    touchdrawView.tag = 902;
    [self.view addSubview:touchdrawView];
    
    
}
はい、プログラムを実行してみます.
直線ボタンを追加して写真に線を描いてみます.
iOS 图片编辑——涂鸦_第7张图片
はい、線分を追加したらここまでにします. ソースコードはグループスペースにアップロードします.  
みんなは興味があったらダウンロードしてもいいです.
次のセクションに矢印を付けます.http://blog.csdn.net/lwjok2007/article/details/50885376
demo:【60312写真に線を引くAddline.zip】
アップル開発グループ:414319235 参加を歓迎します.