• UIImage与位图(RGBA8 Bitmaps)的相互转化


    来自 http://paulsolt.com/2010/09/ios-converting-uiimage-to-rgba8-bitmaps-and-back/

    下载:https://github.com/PaulSolt/UIImage-Conversion

    ImageHelper.h

    /*
    * The MIT License
    *
    * Copyright (c) 2011 Paul Solt, PaulSolt@gmail.com
    *
    * https://github.com/PaulSolt/UIImage-Conversion/blob/master/MITLicense.txt
    *
    */
    #import <Foundation/Foundation.h>
    @interface ImageHelper : NSObject {
    }
    /** Converts a UIImage to RGBA8 bitmap.
    @param image - a UIImage to be converted
    @return a RGBA8 bitmap, or NULL if any memory allocation issues. Cleanup memory with free() when done.
    */
    + (unsigned char *) convertUIImageToBitmapRGBA8:(UIImage *)image;
    /** A helper routine used to convert a RGBA8 to UIImage
    @return a new context that is owned by the caller
    */
    + (CGContextRef) newBitmapRGBA8ContextFromImage:(CGImageRef)image;
    /** Converts a RGBA8 bitmap to a UIImage.
    @param buffer - the RGBA8 unsigned char * bitmap
    @param width - the number of pixels wide
    @param height - the number of pixels tall
    @return a UIImage that is autoreleased or nil if memory allocation issues
    */
    + (UIImage *) convertBitmapRGBA8ToUIImage:(unsigned char *)buffer
    withWidth:(int)width
    withHeight:(int)height;
    @end
    ImageHelper.m
    /*
    * The MIT License
    *
    * Copyright (c) 2011 Paul Solt, PaulSolt@gmail.com
    *
    * https://github.com/PaulSolt/UIImage-Conversion/blob/master/MITLicense.txt
    *
    */
    #import "ImageHelper.h"
    @implementation ImageHelper
    + (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;
    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,
    kCGImageAlphaPremultipliedLast);
    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;
    }
    @end
    这样使用
    NSString *path = (NSString*)[[NSBundle mainBundle] pathForResource:@"Icon4" ofType:@"png"];
    UIImage *image = [UIImage imageWithContentsOfFile:path];
    int width = image.size.width;
    int height = image.size.height;
     
        // Create a bitmap
    unsigned char *bitmap = [ImageHelper convertUIImageToBitmapRGBA8:image];
     
        // Create a UIImage using the bitmap
    UIImage *imageCopy = [ImageHelper convertBitmapRGBA8ToUIImage:bitmap withWidth:width withHeight:height];
     
        // Display the image copy on the GUI
    UIImageView *imageView = [[UIImageView alloc] initWithImage:imageCopy];
     
        // Cleanup
    free(bitmap);

  • 相关阅读:
    HDU
    01字典树模板
    扩展欧几里得和乘法逆元
    HDOJ-1156 Brownie Points II 线段树/树状数组(模板)
    CF-825E Minimal Labels 反向拓扑排序
    CF-831D Office Keys 思维题
    RMQ 解决区间查询问题
    hdu 5073 有坑+方差贪心
    hdu 5074 相邻数和最大dp
    hdu 5078 水题
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2458464.html
Copyright © 2020-2023  润新知