Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CGContext & CGBitmapContextCreateImage errors, how to fix?

I've been at this for hours now, and don't even know how to debug this error. Maybe there's an SO expert who knows what's going on.

- (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);

}

These are the errors that come up once I call this method

<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

Can anyone PLEASE tell me what's going on? Thanks in advance.

like image 708
Raphael Caixeta Avatar asked Dec 02 '22 05:12

Raphael Caixeta


2 Answers

CGBitmapContextCreate returns NULL if there is an error creating the context, so that is the ultimate cause of the "invalid context 0x0" messages-- the context is literally set to 0x0 (NULL) because of an error. I don't know why CGBitmapContextCreate is having an error, but that's where you should start debugging. Check through all your input parameters, and compare your use of CGBitmapContextCreate with one of Apple's examples such as this one.

like image 153
samkass Avatar answered Dec 28 '22 08:12

samkass


Write the drawing code in drawRect. When you want to draw, call [self setNeedsDisplay], which calls your implementation of drawRect. If you're drawing from within a view controller, call [self.view setNeedsDisplay] instead. For example:

-(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];
}
like image 37
Rose Perrone Avatar answered Dec 28 '22 10:12

Rose Perrone