1

我不知道如何将绘制的路径保存到 UIImage?
我知道我必须使用 UIGraphicsBeginImageContext 和类似 [drawImage drawInRect:CGRectMake(0, 0, drawImage.size.width, drawImage.size.height)];
但我不知道把它放在我的触摸功能中的什么地方。

我需要保存图像的每条路径,因为我希望能够在每条绘制线之后更改颜色和 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];
}
4

2 回答 2

3

根据您之前的问题,我假设图像视图是此自定义视图对象的子视图。您将需要在此类中维护一个可变的路径数组。在 处初始化它并在 处touchesBegan:withEvent:关闭路径touchesEnded:withEvent:。将路径推入数组。在每个触摸事件(开始、移动、结束)处,调用一个方法,在将触摸点添加到路径后更新图像视图的图像。

更新图像将涉及创建一个空的图像上下文,然后遍历数组中的所有路径和当前路径,同时抚摸它们。完成绘图后,从上下文生成图像对象并将其设置为图像。非常简单,直到我们注意到每条路径的属性可能不同。为了解决这个问题,您应该为路径创建一个容器类,该类将保存有关路径的属性。将每个路径的此类对象推送到数组中,而不是路径本身。这样您就可以维护视图的状态。

于 2011-06-07T22:09:17.503 回答
1

有一个出路而且非常简单,每次绘制路径对象时,您都可以将其保存在增量图像中,只需在需要的位置创建它,然后在绘制其他内容之前在 draw rect 中显示该图像。

这是示例代码:

  - (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();
    }

之后只需在 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];

}

可能您需要根据自己的需要修改一些代码。希望这对某人有所帮助

于 2013-02-08T06:41:46.393 回答