注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

码农

用最简单的办法解决问题,用最奇怪的办法创造BUG

 
 
 

日志

 
 

UIImage 转 Bitmap  

2013-11-06 11:06:23|  分类: iphone |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

三个方法拷贝去用,不解释,我也只是拿来用用而已


- (unsigned char *) convertUIImageToBitmapRGBA8:(UIImage *) image {

    

    CGImageRef imageRef = image.CGImage;

    

    // Create a bitmap context to draw the uiimage into

    CGContextRef context = [self newBitmapRGBA8ContextFromImage:imageRef];

    

    if(!context) {

        return NULL;

    }

    

    size_t width = CGImageGetWidth(imageRef);

    size_t height = CGImageGetHeight(imageRef);

    

    CGRect rect = CGRectMake(0, 0, width, height);

    

    // Draw image into the context to get the raw image data

    CGContextDrawImage(context, rect, imageRef);

    

    // Get a pointer to the data

    unsigned char *bitmapData = (unsigned char *)CGBitmapContextGetData(context);

    

    // Copy the data and release the memory (return memory allocated with new)

    size_t bytesPerRow = CGBitmapContextGetBytesPerRow(context);

    size_t bufferLength = bytesPerRow * height;

    

    unsigned char *newBitmap = NULL;

    

    if(bitmapData) {

        newBitmap = (unsigned char *)malloc(sizeof(unsigned char) * bytesPerRow * height);

        

        if(newBitmap) {    // Copy the data

            for(int i = 0; i < bufferLength; ++i) {

                newBitmap[i] = bitmapData[i];

            }

        }

        

        free(bitmapData);

        

    } else {

        NSLog(@"Error getting bitmap pixel data\n");

    }

    

    CGContextRelease(context);

    

    return newBitmap;

}


- (CGContextRef) newBitmapRGBA8ContextFromImage:(CGImageRef) image {

    CGContextRef context = NULL;

    CGColorSpaceRef colorSpace;

    uint32_t *bitmapData;

    

    size_t bitsPerPixel = 32;

    size_t bitsPerComponent = 8;

    size_t bytesPerPixel = bitsPerPixel / bitsPerComponent;

    

    size_t width = CGImageGetWidth(image);

    size_t height = CGImageGetHeight(image);

    

    size_t bytesPerRow = width * bytesPerPixel;

    size_t bufferLength = bytesPerRow * height;

    

    colorSpace = CGColorSpaceCreateDeviceRGB();

    

    if(!colorSpace) {

        NSLog(@"Error allocating color space RGB\n");

        return NULL;

    }

    

    // Allocate memory for image data

    bitmapData = (uint32_t *)malloc(bufferLength);

    

    if(!bitmapData) {

        NSLog(@"Error allocating memory for bitmap\n");

        CGColorSpaceRelease(colorSpace);

        return NULL;

    }

    

    //Create bitmap context

    

    context = CGBitmapContextCreate(bitmapData,

                                    width,

                                    height,

                                    bitsPerComponent,

                                    bytesPerRow,

                                    colorSpace,

                                    kCGImageAlphaPremultipliedLast);    // RGBA

    if(!context) {

        free(bitmapData);

        NSLog(@"Bitmap context not created");

    }

    

    CGColorSpaceRelease(colorSpace);

    

    return context;

}


- (UIImage *) convertBitmapRGBA8ToUIImage:(unsigned char *) buffer

                                withWidth:(int) width

                               withHeight:(int) height {

    

    

    size_t bufferLength = width * height * 4;

    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, bufferLength, NULL);

    size_t bitsPerComponent = 8;

    size_t bitsPerPixel = 32;

    size_t bytesPerRow = 4 * width;

    

    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();

    if(colorSpaceRef == NULL) {

        NSLog(@"Error allocating color space");

        CGDataProviderRelease(provider);

        return nil;

    }

    

    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;

    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

    

    CGImageRef iref = CGImageCreate(width,

                                    height,

                                    bitsPerComponent,

                                    bitsPerPixel,

                                    bytesPerRow,

                                    colorSpaceRef,

                                    bitmapInfo,

                                    provider,    // data provider

                                    NULL,        // decode

                                    YES,            // should interpolate

                                    renderingIntent);

    

    uint32_t* pixels = (uint32_t*)malloc(bufferLength);

    

    if(pixels == NULL) {

        NSLog(@"Error: Memory not allocated for bitmap");

        CGDataProviderRelease(provider);

        CGColorSpaceRelease(colorSpaceRef);

        CGImageRelease(iref);

        return nil;

    }

    

    CGContextRef context = CGBitmapContextCreate(pixels,

                                                 width,

                                                 height,

                                                 bitsPerComponent,

                                                 bytesPerRow,

                                                 colorSpaceRef,

                                                 bitmapInfo);

    

    if(context == NULL) {

        NSLog(@"Error context not created");

        free(pixels);

    }

    

    UIImage *image = nil;

    if(context) {

        

        CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, width, height), iref);

        

        CGImageRef imageRef = CGBitmapContextCreateImage(context);

        

        // Support both iPad 3.2 and iPhone 4 Retina displays with the correct scale

        if([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)]) {

            float scale = [[UIScreen mainScreen] scale];

            image = [UIImage imageWithCGImage:imageRef scale:scale orientation:UIImageOrientationUp];

        } else {

            image = [UIImage imageWithCGImage:imageRef];

        }

        

        CGImageRelease(imageRef);    

        CGContextRelease(context);    

    }

    

    CGColorSpaceRelease(colorSpaceRef);

    CGImageRelease(iref);

    CGDataProviderRelease(provider);

    

    if(pixels) {

        free(pixels);

    }    

    return image;

}

  评论这张
 
阅读(4294)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018