CGContext Ref as UIImage - PullRequest
       24

CGContext Ref as UIImage

0 голосов
/ 12 марта 2012

Попытка создать UIimage из контекста рисования. Ничего не видя. Я что-то упустил, или полностью сошел с ума?

код

- (UIImage *)drawRect:(CGRect)rect {

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextMoveToPoint(context, 100, 100);
    CGContextAddLineToPoint(context, 150, 150);
    CGContextAddLineToPoint(context, 100, 200);
    CGContextAddLineToPoint(context, 50, 150);
    CGContextAddLineToPoint(context, 100, 100);

    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
    CGContextFillPath(context);


    // Do your stuff here
    CGImageRef imgRef = CGBitmapContextCreateImage(context);
    UIImage* img = [UIImage imageWithCGImage:imgRef];
    CGImageRelease(imgRef);
    CGContextRelease(context);
    return img;
}

1 Ответ

1 голос
/ 12 марта 2012

Я предполагаю, что это не -drawRect: метод в представлении, потому что возвращаемое значение неверно.(-[UIView drawRect:] возвращает void, а не UIImage*.)

Если оно равно в NSView, это означает, что вы должны вызывать его напрямую, чтобы получить возвращаемое значение.Но это означает, что UIKit не настроил графический контекст, как это обычно делается до вызова -drawRect: для представлений в окне.

Следовательно, вы не должны предполагать, что UIGraphicsGetCurrentContext()действительный.Вероятно, это ноль (вы проверили?).

Если вам просто нужно изображение: используйте UIGraphicsBeginImageContext() для создания контекста, затем UIGraphicsGetImageFromCurrentImageContext() для извлечения UIImage (нет необходимости в посреднике CGImage), затем UIGraphicsEndImageContext() для очистки.

Если вы пытаетесь захватить изображение того, что нарисовал ваш вид: исправьте -drawRect:, чтобы вернуть void, и найдите какой-то другой способ получить этот UIImageвне поля зрения - либо спрятать его в иваре, либо отправить в другой объект, либо записать в файл, как вам угодно.

Также (менее важно):

  1. Не CGContextRelease(context).Вы не создавали, не копировали и не сохраняли его, поэтому не следует его выпускать.

  2. Нет необходимости в последнем CGContextAddLineToPoint().CGContextFillPath неявно закроет вам путь.

...