【Obj-C】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, [email protected]
*
* 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, [email protected]
*
* 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
这样使用
<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(64, 0, 128);">NSString</span> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">*</span>path <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">=</span> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">(</span><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(64, 0, 128);">NSString</span><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">*</span><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">)</span><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">[</span><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">[</span><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(64, 0, 128);">NSBundle</span> mainBundle<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">]</span> pathForResource<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">:</span><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(191, 29, 26);">@</span><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(191, 29, 26);">"Icon4"</span> ofType<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">:</span><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(191, 29, 26);">@</span><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(191, 29, 26);">"png"</span><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">]</span>;
UIImage <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">*</span>image <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">=</span> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">[</span>UIImage imageWithContentsOfFile<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">:</span>path<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">]</span>;
<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(166, 19, 144);">int</span> width <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">=</span> image.size.width;
<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(166, 19, 144);">int</span> height <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">=</span> image.size.height;
 
    <em>// Create a bitmap</em>
<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(166, 19, 144);">unsigned</span> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(166, 19, 144);">char</span> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">*</span>bitmap <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">=</span> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">[</span>ImageHelper convertUIImageToBitmapRGBA8<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">:</span>image<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">]</span>;
 
    <em>// Create a UIImage using the bitmap</em>
UIImage <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">*</span>imageCopy <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">=</span> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">[</span>ImageHelper convertBitmapRGBA8ToUIImage<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">:</span>bitmap withWidth<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">:</span>width withHeight<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">:</span>height<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">]</span>;
 
    <em>// Display the image copy on the GUI</em>
UIImageView <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">*</span>imageView <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">=</span> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">[</span><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">[</span>UIImageView alloc<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">]</span> initWithImage<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">:</span>imageCopy<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">]</span>;
 
    <em>// Cleanup</em>
<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(166, 19, 144);">free</span><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">(</span>bitmap<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; color: rgb(0, 34, 0);">)</span>;


原文链接: http://blog.csdn.net/ibright/article/details/6752247






你可能感兴趣的:(bitmap,NSData,uiimage,imagewithdata)