Drawing images saved in our application

I draw on the image. And save this image in the camera frame, when I save this image, then the alpha image will not be set properly. if I draw an image with 80% alpha, and then click save image, you will save 40% (approximate) alpha. I do not use lib for this. I draw with touch.

Image before saving with draw

Image after saving with draw

code

(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches] anyObject]; currentPoint = [touch locationInView:self.tempimage]; UIGraphicsBeginImageContext(self.tempimage.frame.size); [tempimage.image drawInRect:CGRectMake(0, 0, self.tempimage.frame.size.width, self.tempimage.frame.size.height)]; CGContextMoveToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); strpoint=NSStringFromCGPoint(currentPoint); strpoint1=NSStringFromCGPoint(lastPoint); CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); CGContextRef context = UIGraphicsGetCurrentContext(); if ([linewidth isEqualToString:@"40"]) { CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 40.0); lineWidth=40.0; } if ([linewidth isEqualToString:@"30"]) { CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 15.0); lineWidth=15.0; } if ([linewidth isEqualToString:@"20"]) { CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0); lineWidth=5.0; } if ([streraser isEqualToString:@"eraser"]) { CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear); CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); CGContextSetLineWidth(UIGraphicsGetCurrentContext(), lineWidth); CGContextBeginPath(UIGraphicsGetCurrentContext()); CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear); CGContextMoveToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); CGContextStrokePath(UIGraphicsGetCurrentContext()); } /*CGContextSetAlpha(context,opacity); CGContextSetStrokeColorWithColor(context,newcolor.CGColor); // CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), self->red, self->green, self->blue, self->opacity); CGContextSetBlendMode(UIGraphicsGetCurrentContext(),blendmode);*/ // [self.view.layer renderInContext:context]; -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches] anyObject]; lastPoint=[touch locationInView:tempimage]; NSLog(@"Touch starting point = x : %f Touch Starting Point = y : %f", lastPoint.x, lastPoint.y); myPath=[[UIBezierPath alloc]init]; myPath.lineWidth=self.lineWidth; myPath.lineCapStyle = kCGLineCapRound; redoIndex =0; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { UIGraphicsBeginImageContext(self.tempimage.bounds.size); [self.tempimage.layer renderInContext:UIGraphicsGetCurrentContext()]; rawImage = UIGraphicsGetImageFromCurrentImageContext(); [tempimage setAlpha:self.lineAlpha]; UIGraphicsEndImageContext(); #if PUSHTOFILE lineIndex++; [self performSelectorInBackground:@selector(writeFilesBG) withObject:nil]; #else NSDictionary *lineInfo = [NSDictionary dictionaryWithObjectsAndKeys:rawImage, @"IMAGE",nil]; [pointsArray addObject:lineInfo]; UIBezierPath *_path=[pointsArray lastObject]; [_stack addObject:_path]; [pointsArray removeLastObject]; [self.tempimage setNeedsDisplay]; #endif 

}

 - (IBAction)btnsave:(id)sender { UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:Save_Folder_Name,@"Cancel", nil]; [actionSheet showInView:self.view]; } - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex == 0) { UIGraphicsBeginImageContextWithOptions(self.tempimage.bounds.size, NO, 0.0); // [self.tempimage.image drawInRect:CGRectMake(0, 0, self.tempimage.frame.size.width, self.tempimage.frame.size.height)]; [self.tempimage.image drawInRect:CGRectMake(0, 0, tempimage.frame.size.width, tempimage.frame.size.height) blendMode:blendmode alpha:lineAlpha]; 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]; } } 

Any help would be appreciated.

+5
source share
1 answer

I have two kinds of image, one with tempimage and one with image, I have alpha only set to tempimage, but alpha in both image views is set, then my problem solves (with alpha version 1.0) and tempimage (with alpha 0 , 5), respectively, I can save the snapshot like this:

 - (void)saveSnapshot { CGRect rect = self.tempimage.bounds; UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0); if ([self.tempimage respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) { [self.imageview drawViewHierarchyInRect:rect afterScreenUpdates:YES]; // iOS7+ [self.tempimage drawViewHierarchyInRect:rect afterScreenUpdates:YES]; } else { [self.imageview.layer renderInContext:UIGraphicsGetCurrentContext()]; // pre iOS7 [self.tempimage.layer renderInContext:UIGraphicsGetCurrentContext()]; } UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); } 
0
source

Source: https://habr.com/ru/post/1246122/


All Articles