2016-01-25 2 views
0

Я пытаюсь сохранить изображение с моим глупым рисунком, но когда я сохраняю изображение, только оригинальное изображение будет сохранено.Как сохранить изображение с добавлением UIBeizerPath?

мой ожидаемый образ этого: enter image description here

Это мой образ спасения код:

UIImageWriteToSavedPhotosAlbum(_imgShow.image, 
            nil, 
            nil, 
            nil); 

Это мой UIImageView пользовательский класс:

-(void)awakeFromNib 
{ 
// drawingView=[[UIView alloc]initWithFrame:self.bounds]; 
// drawingView.backgroundColor=[UIColor clearColor]; 
// [self addSubview:drawingView]; 
    clearBeizer=[[NSMutableArray alloc]init]; 
    [self updateMask]; 
} 
-(void)updateMask 
{ 
    CALayer *maskLayer=[CALayer layer]; 
    maskLayer.geometryFlipped=YES; 
    maskLayer.contents=(id)self.image.CGImage; 
    switch (self.contentMode) 
    { 
     case UIViewContentModeScaleToFill: 
      maskLayer.contentsGravity = kCAGravityResize; 
      break; 
     case UIViewContentModeScaleAspectFit: 
      maskLayer.contentsGravity = kCAGravityResizeAspect; 
      break; 
     case UIViewContentModeScaleAspectFill: 
      maskLayer.contentsGravity = kCAGravityResizeAspectFill; 
      break; 
     case UIViewContentModeCenter: 
      maskLayer.contentsGravity = kCAGravityCenter; 
      break; 
     case UIViewContentModeTop: 
      maskLayer.contentsGravity = kCAGravityTop; 
      break; 
     case UIViewContentModeBottom: 
      maskLayer.contentsGravity = kCAGravityBottom; 
      break; 
     case UIViewContentModeLeft: 
      maskLayer.contentsGravity = kCAGravityLeft; 
      break; 
     case UIViewContentModeRight: 
      maskLayer.contentsGravity = kCAGravityRight; 
      break; 
     case UIViewContentModeTopLeft: 
      maskLayer.contentsGravity = kCAGravityTopLeft; 
      break; 
     case UIViewContentModeTopRight: 
      maskLayer.contentsGravity = kCAGravityTopRight; 
      break; 
     case UIViewContentModeBottomLeft: 
      maskLayer.contentsGravity = kCAGravityBottomLeft; 
      break; 
     case UIViewContentModeBottomRight: 
      maskLayer.contentsGravity = kCAGravityBottomRight; 
      break; 
     default: 
      break; 

    } 
    maskLayer.frame=self.bounds; 
// drawingView.layer.mask=maskLayer; 
    self.layer.mask=maskLayer; 

} 
-(void)setImage:(UIImage *)image 
{ 
    [super setImage:image]; 
    [self updateMask]; 
} 
-(void)layoutSubviews 
{ 
    [super layoutSubviews]; 
// drawingView.frame=self.bounds; 
// drawingView.layer.mask.frame=drawingView.bounds; 
    self.frame=self.bounds; 
    self.layer.mask.frame=self.bounds; 
} 
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[event allTouches] anyObject]; 
    startingPoint = [touch locationInView:self]; 

} 
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[event allTouches] anyObject]; 
    touchPoint = [touch locationInView:self]; 

    if (!CGPointEqualToPoint(startingPoint, CGPointZero)) 
    { 
     UIBezierPath *path = [UIBezierPath bezierPath]; 
     [path moveToPoint:CGPointMake(touchPoint.x,touchPoint.y)]; 
     [path addLineToPoint:CGPointMake(startingPoint.x,startingPoint.y)]; 

     CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 
     shapeLayer.path = [path CGPath]; 
     shapeLayer.strokeColor = [[UIColor blueColor] CGColor]; 
     if([UIDevice currentDevice].userInterfaceIdiom ==UIUserInterfaceIdiomPad) 
     { 
      shapeLayer.lineWidth = 7.0; 
     } 
     else 
     { 
      shapeLayer.lineWidth = 5.0; 

     } 

     shapeLayer.fillColor = [[UIColor redColor] CGColor]; 
     [self.layer addSublayer:shapeLayer]; 
     [clearBeizer addObject:shapeLayer]; 
    } 
    startingPoint=touchPoint; 

    // [arrLayer addObject:shapeLayer]; 
    NSLog(@"Touch moving point =x : %f Touch moving point =y : %f", touchPoint.x, touchPoint.y); 
} 

Это мой собственный класс.

+0

Насколько я понимаю, вы используете пользовательский подкласс UIImageView, который манипулирует ** визуализацией ** изображения, а не самими данными изображения. Показывать свой подклассу; убедитесь, что getter для 'image' возвращает измененные данные. – SmokeDispenser

+0

@JanGreve ok bro подождать минуту –

ответ

1

Вы просто меняете изображение изображения, а не данные самого изображения, но затем записываете эти данные и ожидаете, что это отразит рендеринг вашего представления.

Вы можете использовать snapshotViewAfterScreenUpdates:, а результаты от this question действительно управляют тем, что вы на самом деле хотите архивировать.

1

Здесь вам нужно сделать снимок экрана из ваших окон, и как только вы получите снимок экрана, вы получите это изображение. Но вам потребуется внести изменения в соответствии с вашими требованиями. Когда вы снимаете снимок экрана, вы также получите панель навигации и панель инструментов. Таким образом, вам нужно сделать один снимок экрана, а с него сделать второй снимок экрана, чтобы получить изображение без панели навигации и панели инструментов. Для сохранения изображения pl. посетить ниже URL:

Вот что я сделал:

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    endPoint = [touch locationInView:self.IBImgView]; 

    SPUserResizableView *spResizable = [[SPUserResizableView alloc] initWithFrame:CGRectMake(0,0,100,200)]; 

    UIView *contentView = [[UIView alloc] initWithFrame:spResizable.frame]; 
    [contentView setBackgroundColor:[UIColor clearColor]]; 

    CAShapeLayer *lines = [CAShapeLayer layer]; 
    lines.path = self.drawPath.CGPath; 
    lines.lineCap = kCALineCapSquare; 
    [self.drawPath removeAllPoints]; 
    lines.bounds = CGPathGetBoundingBox(lines.path); 
    lines.strokeColor = [UIColor blackColor].CGColor; 
    lines.fillColor = [UIColor blackColor].CGColor; /*if you just want lines*/ 
    lines.lineWidth = 3; 
    lines.position = CGPointMake(spResizable.frame.size.width/2.0f-10, spResizable.frame.size.height/2.0f-10); 
    lines.anchorPoint = CGPointMake(.5, .5); 
    [contentView.layer addSublayer:lines]; 

    spResizable.contentView = contentView; 

    [spResizable hideEditingHandles];  
    [self.view addSubview:spResizable]; 
    [self.view setNeedsDisplay]; 
} 

Сохранить изображение

- (IBAction)btnSaveTapped:(id)sender { 
[UIImagePNGRepresentation(self.IBImgView.image) writeToFile:[self saveDataInDirectory:@"Img1"] atomically:YES]; 
} 


- (NSString *) saveDataInDirectory:(NSString *)strFileName { 
NSString *strDocPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *strDirName; 
NSFileManager *fileManager = [[NSFileManager alloc] init]; 
    // Original Image 
    strDirName = [strDocPath stringByAppendingPathComponent:kDocOriginalImg]; 
    if (![fileManager fileExistsAtPath:strDirName]) { 
     [fileManager createDirectoryAtPath:strDirName withIntermediateDirectories:NO attributes:nil error:nil]; 
    } 
    strDirName = [[strDirName stringByAppendingPathComponent:strFileName] stringByAppendingPathExtension:@"png"]; 
return strDirName; 

}

Но убедитесь, что ваш spResizable вид выше UIImageView.

Taking ScreenShot Programmatically

И если вы хотите, чтобы перерисовать изображение с таким же путем, а затем удалить текущий путь и сделать новый путь, который вы можете использовать SPUserResizableView. Но для этого вам нужно хранить данные в словаре для редактирования.

Надеюсь, это поможет решить вашу проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^