绘图时保持相同的图像比例

时间:2015-03-02 14:14:43

标签: ios objective-c xcode

下午好,

我正在尝试创建一个可以在图像上书写的绘图应用程序。问题是,当我尝试这样做时,我对Draw功能有一些问题。

当我触摸屏幕开始绘制时,一切都很好,但是当我完成绘制时(通过触摸屏幕),图像从正常图像变为调整大小的图像。

我在画画时如何保持相同的图像比例?

以下是它发生的事情:

当我没有触摸屏幕时

http://www.idermo.es/IMG_0275.PNG

当我触摸并完成抽奖时,那就是

http://www.idermo.es/IMG_0276.PNG

这是我的完整代码:

//  DrawViewController.m


#import "DrawViewController.h"


@interface DrawViewController ()

@end

@implementation DrawViewController

@synthesize mainImage;

@synthesize tempDrawImage;



- (void)viewDidLoad

{

    red = 0.0/255.0;

    green = 0.0/255.0;

    blue = 0.0/255.0;

    brush = 5.0;

    opacity = 1.0;

    self.mainImage.image = _image;



    [super viewDidLoad];

}



- (void)viewDidUnload

{

    [self setMainImage:nil];

    [self setTempDrawImage:nil];

    [super viewDidUnload];

    // Release any retained subviews of the main view.

}



- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{

    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);

}



- (IBAction)pencilPressed:(id)sender {



    red = 0.0/255.0;

    green = 0.0/255.0;

    blue = 0.0/255.0;

}



- (IBAction)reset:(id)sender {



    self.mainImage.image = nil;



}



- (IBAction)save:(id)sender {



    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@""

                                                             delegate:self

                                                    cancelButtonTitle:nil

                                               destructiveButtonTitle:nil

                                                    otherButtonTitles:@"Save to Camera Roll", @"Tweet it!", @"Cancel", nil];

    [actionSheet showInView:self.view];

}



- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex

{

    if (buttonIndex == 1)

    {



    } else if(buttonIndex == 0) {



        UIGraphicsBeginImageContextWithOptions(self.mainImage.bounds.size, NO, 0.0);

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

        UIImage *SaveImage = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();

        UIImageWriteToSavedPhotosAlbum(SaveImage, self,@selector(image:didFinishSavingWithError:contextInfo:), nil);

    }

}



- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo

{

    // Was there an error?

    if (error != NULL)

    {

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Image could not be saved.Please try again"  delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Close", nil];

        [alert show];

    } else {

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Success" message:@"Image was successfully saved in photoalbum"  delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Close", nil];

        [alert show];

    }

}



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



    mouseSwiped = NO;

    UITouch *touch = [touches anyObject];

    lastPoint = [touch locationInView:self.view];

}



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



    mouseSwiped = YES;

    UITouch *touch = [touches anyObject];

    CGPoint currentPoint = [touch locationInView:self.view];



    UIGraphicsBeginImageContext(self.view.frame.size);

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

    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);

    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);

    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);

    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush );

    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0);

    CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeNormal);



    CGContextStrokePath(UIGraphicsGetCurrentContext());

    self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();

    [self.tempDrawImage setAlpha:opacity];

    UIGraphicsEndImageContext();



    lastPoint = currentPoint;

}



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



    if(!mouseSwiped) {

        UIGraphicsBeginImageContext(self.view.frame.size);

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

        CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);

        CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush);

        CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, opacity);

        CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);

        CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);

        CGContextStrokePath(UIGraphicsGetCurrentContext());

        CGContextFlush(UIGraphicsGetCurrentContext());

        self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();

    }



    UIGraphicsBeginImageContext(self.mainImage.frame.size);

    [self.mainImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) blendMode:kCGBlendModeNormal alpha:1.0];

    [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) blendMode:kCGBlendModeNormal alpha:opacity];

    self.mainImage.image = UIGraphicsGetImageFromCurrentImageContext();

    self.tempDrawImage.image = nil;

    UIGraphicsEndImageContext();

}

@end

我在画画时如何保持相同的图像比例?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我认为问题出在你的触摸结束代码的最后一部分。我认为你的UIImage(mainImage.image)小于UIImageView(mainImage)

尝试以下代码:

UIGraphicsBeginImageContext(self.mainImage.frame.size);

[self.mainImage.image drawInRect:CGRectMake((self.mainImage.frame.size.width - self.mainImage.image.size.width) / 2, (self.mainImage.frame.size.height - self.mainImage.image.size.height) / 2, self.mainImage.image.size.width, mainImage.image.size.height) blendMode:kCGBlendModeNormal alpha:1.0];//mainImage.image is smaller than mainImage's frame. So draw it at appropiate position and size, so no scaling is caused.

[self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) blendMode:kCGBlendModeNormal alpha:opacity];

self.mainImage.image = UIGraphicsGetImageFromCurrentImageContext();

self.tempDrawImage.image = nil;

UIGraphicsEndImageContext();