UIGraphicsGetImageFromCurrentImageContext возвращает неожиданный ноль - PullRequest
1 голос
/ 24 ноября 2011


У меня есть следующий код:

CGContextRef ctx = UIGraphicsGetCurrentContext();
UIGraphicsBeginImageContext(size);
screenImageContext = UIGraphicsGetCurrentContext();
ctx = screenImageContext;

UIGraphicsPushContext(UIGraphicsGetCurrentContext());
ctx  = UIGraphicsGetCurrentContext();

NSLog(@" %@",screenImageContext);
UIImage * result = UIGraphicsGetImageFromCurrentImageContext(); // Returns nil

UIImageWriteToSavedPhotosAlbum(result, nil, nil, nil);

UIGraphicsPopContext();
result = UIGraphicsGetImageFromCurrentImageContext(); // returns valid result

Моя проблема в том, что UIGraphicsGetImageFromCurrentImageContext возвращает ноль, а вторая после UIGraphicsPopContext возвращает правильный результат.

В документах четко указано, что UIGraphicsGetImageFromCurrentImageContext вернет ноль, если либо контекст равен нулю, либо текущий контекст не является графическим контекстом, но обе эти проблемы здесь не возникают.

Если бы кто-нибудь мог пролить свет на это, я был бы очень признателен
Шай.

1 Ответ

5 голосов
/ 24 ноября 2011

Насколько я понимаю, ваша проблема проистекает из следующей строки

UIGraphicsPushContext(UIGraphicsGetCurrentContext());

С помощью этого вызова вы пытаетесь сделать текущий контекст текущим контекстом. Это действительно не имеет никакого смысла.

Кроме того, ваш код немного зашифрован, вы вызываете UIGraphicsGetCurrentContext (), который возвращает текущий контекст, затем вызываете UIGraphisBeginImageContext (размер CGSize), как указано в документе

.

Создает растровый графический контекст и делает его текущим контекстом

Затем вы снова получаете текущий графический контекст, который теперь является растровым графическим контекстом благодаря предыдущему вызову, затем вы перезаписываете исходный CGContextRef ("ctx"), который вы только что получили.

Я не уверен на 100%, чего вы хотели достичь с помощью своего кода, но если вы просто пытались захватить содержимое растрового контекста в изображении и сохранить его в фотоальбоме, то следующий код будет сделай это.

CGSize size = CGSizeMake(320, 480); //Screen Size on iPhone device
UIGraphicsBeginImageContext(size);  //Create a new Bitmap-based graphics context (also makes this the current context)
CGContextRef screenImageContext = UIGraphicsGetCurrentContext(); //get a reference to the context we just made above
NSLog(@" %@",screenImageContext);
//NOTE: without any drawring code in here this will just be a blank image (white/alpha)
// or an image set to whatever the current UIColor is set to
//So you may want to add some drawing code in here. Although TBH I'm not sure what you were originally
// trying to achieve.
UIImage * result = UIGraphicsGetImageFromCurrentImageContext(); // Returns nil
NSLog(@" %@",result); //just output this to demonstrate that it's non null/nil
UIImageWriteToSavedPhotosAlbum(result, nil, nil, nil);
UIGraphicsEndImageContext(); //Removes the current bitmap-based graphics context from the top of the stack

Надеюсь, это поможет.

...