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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值