您的位置:首页 > 产品设计 > UI/UE

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

2014-07-31 15:03 302 查看
来自 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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: