生成绘制的图像

时间:2015-08-05 05:10:37

标签: ios objective-c xcode

在我的xcode项目中,用户手动绘制对象。例如,他们可以画一个苹果或三角形。

我需要保存我猜他们绘制的坐标或直线路径。

如何存储线路径或重新创建用户绘制的图像。 我不想保存图片,但我想通过了解具体的线路来了解用户绘制的图片?

这是代码

·H

 int mouseMoved;    
 BOOL  mouseSwiped;    
 CGPoint   lastPoint;    
 UIImageView *drawImage;


 viewdidload {
        drawImage = [[UIImageView alloc] initWithImage:nil];
        drawImage.frame = self.view.frame;
        [self.view addSubview:drawImage];
        self.view.backgroundColor = [UIColor lightGrayColor];
        mouseMoved = 0;
           }

.m

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

            BOOL   mouseSwiped = NO;
            UITouch *touch = [touches anyObject];

            if ([touch tapCount] == 2) {
                drawImage.image = nil;
                return;
             }

             lastPoint = [touch locationInView:self.view];
             lastPoint.y -= 20;

          }


     - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
             mouseSwiped = YES;

             UITouch *touch = [touches anyObject];
             CGPoint currentPoint = [touch locationInView:self.view];
             currentPoint.y -= 20;

             UIGraphicsBeginImageContext(self.view.frame.size);
             [drawImage.image drawInRect:CGRectMake(0, 0,         self.view.frame.size.width, self.view.frame.size.height)];

             CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
             CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0);
             CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0, 0.0, 0.0, 1.0);
             CGContextBeginPath(UIGraphicsGetCurrentContext());
             CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
             CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
             CGContextStrokePath(UIGraphicsGetCurrentContext());

             drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
             UIGraphicsEndImageContext();

             lastPoint = currentPoint;    
             mouseMoved++;

              if (mouseMoved == 10) {
                           mouseMoved = 0;
                }

            }

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

                   UITouch *touch = [touches anyObject];    
                       if ([touch tapCount] == 2) {
                           drawImage.image = nil;
                                return;
                            }

            _startPoint = [touch locationInView:self.view];

if(!mouseSwiped) {
    UIGraphicsBeginImageContext(self.view.frame.size);
    [drawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0, 0.0, 0.0, 1.0);
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    CGContextFlush(UIGraphicsGetCurrentContext());
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();


   }
 }

1 个答案:

答案 0 :(得分:-1)

-(void)digitalSignatureCalled{

    //viewSign.backgroundColor = [UIColor lightGrayColor];

    //create a frame for our signature capture based on whats remaining
    imageFrame = CGRectMake(0, 50, 500, 450);

    //allocate an image view and add to the main view
    mySignatureImage = [[UIImageView alloc] initWithImage:nil];
    mySignatureImage.frame = imageFrame;
    mySignatureImage.backgroundColor = [UIColor whiteColor];
    [viewSign addSubview:mySignatureImage];
}

//when one or more fingers touch down in a view or window
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    //did our finger moved yet?
    fingerMoved = NO;
    UITouch *touch = [touches anyObject];

    //just clear the image if the user tapped twice on the screen
    if ([touch tapCount] == 2) {
        mySignatureImage.image = nil;
        return;
    }

    //we need 3 points of contact to make our signature smooth using quadratic bezier curve
    currentPoint = [touch locationInView:mySignatureImage];
    lastContactPoint1 = [touch previousLocationInView:mySignatureImage];
    lastContactPoint2 = [touch previousLocationInView:mySignatureImage];

}

//when one or more fingers associated with an event move within a view or window
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    //well its obvious that our finger moved on the screen
    fingerMoved = YES;
    UITouch *touch = [touches anyObject];

    //save previous contact locations
    lastContactPoint2 = lastContactPoint1;
    lastContactPoint1 = [touch previousLocationInView:mySignatureImage];
    //save current location
    currentPoint = [touch locationInView:mySignatureImage];

    //find mid points to be used for quadratic bezier curve
    CGPoint midPoint1 = [self midPoint:lastContactPoint1 withPoint:lastContactPoint2];
    CGPoint midPoint2 = [self midPoint:currentPoint withPoint:lastContactPoint1];

    //create a bitmap-based graphics context and makes it the current context
    UIGraphicsBeginImageContext(imageFrame.size);

    //draw the entire image in the specified rectangle frame
    [mySignatureImage.image drawInRect:CGRectMake(0, 0, imageFrame.size.width, imageFrame.size.height)];

    //set line cap, width, stroke color and begin path
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 3.0f);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0);
    CGContextBeginPath(UIGraphicsGetCurrentContext());

    //begin a new new subpath at this point
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), midPoint1.x, midPoint1.y);
    //create quadratic Bézier curve from the current point using a control point and an end point
    CGContextAddQuadCurveToPoint(UIGraphicsGetCurrentContext(),
                                 lastContactPoint1.x, lastContactPoint1.y, midPoint2.x, midPoint2.y);

    //set the miter limit for the joins of connected lines in a graphics context
    CGContextSetMiterLimit(UIGraphicsGetCurrentContext(), 2.0);

    //paint a line along the current path
    CGContextStrokePath(UIGraphicsGetCurrentContext());

    //set the image based on the contents of the current bitmap-based graphics context
    mySignatureImage.image = UIGraphicsGetImageFromCurrentImageContext();

    //remove the current bitmap-based graphics context from the top of the stack
    UIGraphicsEndImageContext();

}

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

    UITouch *touch = [touches anyObject];
    //just clear the image if the user tapped twice on the screen
    if ([touch tapCount] == 2) {
        mySignatureImage.image = nil;
        return;
    }
    //if the finger never moved draw a point
    if(!fingerMoved) {
        UIGraphicsBeginImageContext(imageFrame.size);
        [mySignatureImage.image drawInRect:CGRectMake(0, 0, imageFrame.size.width, imageFrame.size.height)];

        CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
        CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 3.0f);
        CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0);
        CGContextMoveToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
        CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
        CGContextStrokePath(UIGraphicsGetCurrentContext());
        CGContextFlush(UIGraphicsGetCurrentContext());

        mySignatureImage.image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }
}

//calculate midpoint between two points
- (CGPoint) midPoint:(CGPoint )p0 withPoint: (CGPoint) p1 {
    return (CGPoint) {
        (p0.x + p1.x) / 2.0,
        (p0.y + p1.y) / 2.0
    };
}

-(void)clickToSave:(id)sender{
    //convert image into .png format.

    viewNewSign.image = mySignatureImage.image;

    if (mySignatureImage.image == nil) {
        imgString = @"NoSignature";
    }else{
        imgString = [self getStringFromImage:mySignatureImage.image];
    }
    NSLog(@"image saved = %@",imgString);
    NSLog(@"image length = %lu",(unsigned long)imgString.length);
    viewSign.hidden = TRUE;
    scroll.scrollEnabled = YES;
    [scroll bringSubviewToFront:viewSign];
}

-(NSString *)getStringFromImage:(UIImage *)image{
    if(image){
        NSData *dataObj = UIImagePNGRepresentation(image);
        //[appDelegate showAlert:@"Data Size" message:[NSString stringWithFormat:@"Data length = %lu",(unsigned long)dataObj.length]];
        return [dataObj base64EncodedStringWithOptions:0];
    } else {
        return @"";
    }
}

-(void)clickToClear:(id)sender{
    [self digitalSignatureCalled];
}
- (UIImage*)imageWithImage:(UIImage*)image
              scaledToSize:(CGSize)newSize;
{
    UIGraphicsBeginImageContext( newSize );
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}