开发者

What could be the cause of this error with CGBitmapContextCreate()?

My application gives these errors on the console:

<Error>: CGBitmapContextCreateImage: invalid context 0xdf12000
Program received signal:  “EXC_BAD_ACCESS”.

from the following code:

- (UIImage *)pureBlackAndWhiteImage:(UIImage *)image {

//CGImageRef imageR = [image CGImage];
CGColorSpaceRef colorSpac = CGColorSpaceCreateDeviceGray(); 
//CGRect rect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height); 
CGContextRef contex = CGBitmapContextCreate(NULL, image.size.width, 
                                            image.size.height, 8, 1*image.size.width, colorSpac, kCGImageAlphaNone); 
contex = malloc(image.size.height * image.size.width * 4);
    CGColorSpaceRelease(colorSpac); 
// Draw the image into the grayscale context 

//CGContextDrawImage(contex, rect, NULL); 
CGImageRef grayscale = CGBitmapContextCreateImage(contex); 
CGContextRelease(contex); 


NSUInteger width = CGImageGetWidth(grayscale);
NSUInteger height = CGImageGetHeight(grayscale);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CFDataRef datare=CGDataProviderCopyData(CGImageGetDataProvider(grayscale));



u开发者_运维技巧nsigned char *dataBitmap=(unsigned char *)CFDataGetBytePtr(datare);
dataBitmap = malloc(height * width * 4);
NSUInteger bytesPerPixel = 1;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(dataBitmap, width, height,
                                             bitsPerComponent, bytesPerRow, colorSpace,
                                             kCGImageAlphaNoneSkipLast);


//unsigned char *dataBitmap = [self bitmapFromImage:image];

for (int i = 0; i < image.size.width * image.size.height * 4; i += 4) {

   // if ((dataBitmap[i + 1] + dataBitmap[i + 2] + dataBitmap[i + 3]) < (255 * 3 / 2)) {

    if(dataBitmap[i+1]>128 && dataBitmap[i+2]>128 && dataBitmap[i+3]>128)
    {
        dataBitmap[i + 1] = 0;
        dataBitmap[i + 2] = 0;
        dataBitmap[i + 3] = 0;
    } else {
        dataBitmap[i + 1] = 255;
        dataBitmap[i + 2] = 255;
        dataBitmap[i + 3] = 255;
    }
}



   //CFDataRef newData=CFDataCreate(NULL,dataBitmap,length);
CGColorSpaceRef colorSpa = CGColorSpaceCreateDeviceRGB();
CGContextRef bitmapcontext = CGBitmapContextCreate(dataBitmap,
                                                   image.size.width, 
                                                   image.size.height, 
                                                   8, 
                                                   1*image.size.width, 
                                                   colorSpa, 
                                                   kCGImageAlphaNone);
CFRelease(colorSpace);
CFRelease(colorSpa);
CGImageRef cgImage = CGBitmapContextCreateImage(bitmapcontext);
CFRelease(cgImage);
CFRelease(bitmapcontext);
CGContextRelease(context);
free(dataBitmap);
//CFRelease(imageR);
UIImage *newImage = [UIImage imageWithCGImage:cgImage];
return newImage;

}

What could be causing these errors?


You're trying to create the context using 4 bytes per row, when the width of the image is a lot more than that. If you have 1 byte per pixel, then instead of 4 you should use 1 * image.size.width, like you do the second and third times you create a bitmap context.

Besides that, I don't think passing imageR as the first argument is a good idea. If you're deploying for iOS 4 or later, you can pass NULL instead.
Otherwise, I think you have to allocate the memory to store the bitmap context data.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜