#ios4 #uiimage #drawing
#ios4 #uiimage #рисование
Вопрос:
В функции drawrect UIView я использую CGContext для рисования некоторых фигур. Это работает нормально, я вижу свои фигуры. Теперь я пытаюсь сохранить то, что было нарисовано в представлении, в формате png на диске. Я читал различные документы / статьи, но ничего не сохраняется. Я тестирую симулятор для ios 4.3.
Редактировать 1
Я изменил свой код и раскомментировал контекстную часть. Я могу сохранить png, но он пустой.
- (void)drawRect:(CGRect)rect
{
CGContextRef ctx= UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(ctx, 0, 0, 0, .5);
CGContextBeginPath(ctx);
CGContextAddPath(ctx, mutatablepath);
//CGContextStrokePath(ctx);
CGContextFillPath(ctx);
CFRelease(mutatablepath);
NSString *path0;
NSArray *paths0=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
path0=[[paths0 objectAtIndex:0]stringByAppendingPathComponent:@"images"];
NSError *error;
if (![[NSFileManager defaultManager]fileExistsAtPath:path0]) {
if(![[NSFileManager defaultManager]createDirectoryAtPath:path0 withIntermediateDirectories:NO attributes:nil error:amp;error])
{
NSLog(@"Create directory error %@",error);
}
}
UIGraphicsBeginImageContext(self.bounds.size);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *imagedata=UIImagePNGRepresentation(image);
NSString *namepath=[NSString stringWithFormat:@"%@.png",@"test"];
NSString *path;
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
path=[[paths objectAtIndex:0]stringByAppendingPathComponent:@"images"];
NSString *savepath=[NSString stringWithFormat:@"%@/%@",path,namepath ];
// NSError
NSLog(@"%@",savepath);
[imagedata writeToFile:savepath atomically:YES];
}
Комментарии:
1. Из документации для UIGraphicsGetImageFromCurrentImageContext: вы должны вызывать эту функцию только тогда, когда графический контекст на основе растрового изображения является текущим графическим контекстом. Если текущий контекст равен нулю или не был создан вызовом UIGraphicsBeginImageContext , эта функция возвращает nil .
Ответ №1:
Вы можете сделать это, убрав код сохранения изображения из своего drawRect
метода, поскольку renderInContext
метод неявно вызывается drawRect
по мере необходимости:
UIView *myView = [[MyViewClass alloc] initWithFrame:CGRectMake(/*...*/)];
UIGraphicsBeginImageContext(myView.bounds.size);
[myView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Источник: http://pastie.org/244916