Ошибки CGContext & CGBitmapContextCreateImage, как исправить? - PullRequest
4 голосов
/ 26 августа 2010

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

- (void) prepareSubset {

CGSize size = [image size];

float scale = fminf(1.0f, fmaxf(SUBSET_SIZE / cropRect.size.width, SUBSET_SIZE / cropRect.size.height));
CGPoint offset = CGPointMake(-cropRect.origin.x, -cropRect.origin.y);

subsetWidth = cropRect.size.width * scale;
subsetHeight = cropRect.size.height * scale;

subsetBytesPerRow = ((subsetWidth + 0xf) >> 4) << 4;
subsetData = (unsigned char *)malloc(subsetBytesPerRow * subsetHeight);

CGColorSpaceRef grayColorSpace = CGColorSpaceCreateDeviceGray();

CGContextRef ctx = CGBitmapContextCreate(subsetData, subsetWidth, subsetHeight, 8, subsetBytesPerRow, grayColorSpace, kCGImageAlphaNone);
CGColorSpaceRelease(grayColorSpace);
CGContextSetInterpolationQuality(ctx, kCGInterpolationNone);
CGContextSetAllowsAntialiasing(ctx, false);

CGContextTranslateCTM(ctx, 0.0, subsetHeight);
CGContextScaleCTM(ctx, 1.0, -1.0);  

UIGraphicsPushContext(ctx);
CGRect rect = CGRectMake(offset.x * scale, offset.y * scale, scale * size.width, scale * size.height);
[image drawInRect:rect];
UIGraphicsPopContext();

CGContextFlush(ctx);

CGImageRef subsetImageRef = CGBitmapContextCreateImage(ctx);

self.subsetImage = [UIImage imageWithCGImage:subsetImageRef];
CGImageRelease(subsetImageRef);

CGContextRelease(ctx);

}

Это ошибки, которые появляются, когда я вызываю этот метод

<Error>: CGContextSetInterpolationQuality: invalid context 0x0
<Error>: CGContextSetAllowsAntialiasing: invalid context 0x0
<Error>: CGContextTranslateCTM: invalid context 0x0
<Error>: CGContextScaleCTM: invalid context 0x0
<Error>: CGContextSaveGState: invalid context 0x0
<Error>: CGContextSetBlendMode: invalid context 0x0
<Error>: CGContextSetAlpha: invalid context 0x0
<Error>: CGContextTranslateCTM: invalid context 0x0
<Error>: CGContextScaleCTM: invalid context 0x0
<Error>: CGContextDrawImage: invalid context 0x0
<Error>: CGContextRestoreGState: invalid context 0x0
<Error>: CGContextFlush: invalid context 0x0
<Error>: CGBitmapContextCreateImage: invalid context 0x0

Может кто-нибудьПОЖАЛУЙСТА, скажи мне, что происходит?Заранее спасибо.

Ответы [ 2 ]

11 голосов
/ 26 августа 2010

CGBitmapContextCreate возвращает NULL, если возникает ошибка при создании контекста, поэтому это является основной причиной появления сообщений «недопустимый контекст 0x0» - контекст буквально устанавливается в 0x0 (NULL) из-за ошибки.Я не знаю, почему CGBitmapContextCreate имеет ошибку, но именно здесь вы должны начать отладку.Проверьте все ваши входные параметры и сравните использование CGBitmapContextCreate с одним из примеров Apple, таким как этот .

8 голосов
/ 12 октября 2010

Введите код для рисования в drawRect.Когда вы хотите нарисовать, позвоните [self setNeedsDisplay], который вызывает вашу реализацию drawRect.Если вы рисуете из контроллера вида, вместо этого вызовите [self.view setNeedsDisplay].Например:

-(void)drawRect:(CGRect)rect {
    CGRect currentRect = CGRectMake(50,50,20,20);
    UIColor *currentColor = [UIColor redColor];

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetLineWidth(context, 2.0);
    CGContextSetStrokeColorWithColor(context, currentColor.CGColor);

    CGContextSetFillColorWithColor(context, currentColor.CGColor);  
    CGContextAddEllipseInRect(context, currentRect);
    CGContextDrawPath(context, kCGPathFillStroke);
}   

- (void)nowIWantToDraw {
  [self.view setNeedsDisplay];
}
...