2011-06-07 36 views
1

我無法弄清楚如何將我的繪製路徑保存到UIImage?
我知道我必須使用UIGraphicsBeginImageContext和類似[drawImage drawInRect:CGRectMake(0,0,drawImage.size.width,drawImage.size.height)];
但我不知道把它放在我的觸摸功能中。如何將UIBezierPath保存到現有的UIImageView?

我需要保存圖像的每條路徑,因爲我希望能夠在每條繪製的線後更改顏色和alpha值。
使用此代碼,當我更改值時,所有行將在同一時間調整顏色和寬度。

- (id) initWithFrame:(CGRect)frame andImage: (UIImageView*) image 
{ 
    ... 
    paths = [[NSMutableArray alloc]init]; 

    drawImage = image; 
    self.backgroundColor=[UIColor clearColor]; 
    [self addSubview:drawImage]; 
} 
- (void)drawRect:(CGRect)rect 
{ 
    [brushPattern setStroke]; 
    [myPath strokeWithBlendMode:kCGBlendModeNormal alpha:1.0]; 
    // Drawing code 
    //[myPath stroke]; 
} 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *mytouch=[[touches allObjects] objectAtIndex:0]; 
    myPath=[[UIBezierPath alloc]init]; 
    [myPath moveToPoint:[mytouch locationInView:self]]; 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *mytouch=[[touches allObjects] objectAtIndex:0]; 
    [myPath addLineToPoint:[mytouch locationInView:self]]; 
    [self setNeedsDisplay]; 
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 

    [paths addObject:myPath]; 
    [myPath release]; 
} 

回答

3

根據您先前的問題,我假設圖像視圖是此自定義視圖對象的子視圖。你需要在這個類中維護一個可變路徑數組。將其初始化爲touchesBegan:withEvent:並關閉路徑touchesEnded:withEvent:。將路徑推入數組。在每個觸摸事件(開始,移動,結束)中,調用一個方法,在將觸點添加到路徑後更新圖像視圖的圖像。

更新圖像將涉及創建一個空的圖像上下文,然後遍歷數組中的所有路徑和當前路徑,同時撫摸它們。完成繪圖後,從上下文生成圖像對象並將其設置爲圖像。直到我們注意到每個路徑可能在屬性上有所不同時,我們纔會很直觀要處理這個問題,你應該爲路徑創建一個容器類,它將保存路徑的屬性。將該類的一個對象推入數組中的每個路徑,而不是路徑本身。這樣你可以維護你的視圖的狀態。

+0

如何更新圖像視圖的圖像?我不明白我如何在我的圖像視圖中放置路徑。因爲我只設置了一個指向該路徑的點,但從不將該路徑鏈接到該圖像視圖。 – madmax 2011-06-07 22:47:46

+1

已經創建了一個['sample project'](http://dl.dropbox.com/u/22783696/Beziers.zip),它會給你一個基本的想法。我將路徑推入數組並在最後使用相同的筆觸顏色來繪製它們。就像上面提到的那樣,你將不得不創建一個複合對象來存儲關於路徑和路徑本身的顏色信息,並將該對象推入數組中。 – 2011-06-08 00:23:53

+0

謝謝!現在我懂了。 ;-)但是當我將它傳遞給這個畫圖控制器時,我的圖像視圖包含了一些圖紙。所以現在它會被覆蓋。我如何將這些內容添加到圖像上下文中,所以路徑位於此圖像之上? – madmax 2011-06-08 10:04:47

1

有一種出路和非常簡單的事實,每次繪製路徑對象時,您都可以將其保存爲增量圖像,只需在需要的地方創建它,然後在繪製其他東西之前在繪製矩形中顯示此圖像。

這裏是示例代碼:

- (void)drawBitmap 
{ 
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0.0); 
    [strokeColor setStroke]; 
    if (!incrementalImage) // first time draw; paint background white by ... 
    { 
     UIBezierPath *rectpath = [UIBezierPath bezierPathWithRect:self.bounds]; // enclosing bitmap by a rectangle defined by another UIBezierPath object 
     [[UIColor colorWithPatternImage:[UIImage imageNamed:@"two.jpg"]] setFill]; 
     //[[UIColor whiteColor] setFill]; 
     [rectpath fill]; // filling it with white 
     NSLog(@"========== ... drawBitmap .. CALLED======="); 
    } 
    [incrementalImage drawAtPoint:CGPointZero]; 

    for(NSDictionary *_pathDict in pathArray) 
    { 
     [((UIColor *)[_pathDict valueForKey:@"color"]) setStroke]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor) 
     [[_pathDict valueForKey:@"path"] strokeWithBlendMode:kCGBlendModeNormal alpha:1.0]; 
    } 
    incrementalImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    } 

後,只是把這種INCREAMENTAL圖像中的drawRect:,讓用戶擁有連續拉拔的幻覺,那麼你就可以節省大量的時間這一形象一點:

- (void)drawRect:(CGRect)rect 
{ 

    [incrementalImage drawInRect:rect]; 
    [[dict_path objectForKey:@"color"] setStroke]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor) 

    [[dict_path objectForKey:@"path"] strokeWithBlendMode:kCGBlendModeNormal alpha:1.0]; 

} 

可能是你需要修改一些代碼,根據自己的need.Hope此幫助別人

相關問題