UIImage与位图(RGBA8 Bitmaps)的相互转化
来源:互联网 发布:java的final类 编辑:程序博客网 时间:2024/06/06 00:00
来自 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)widthwithHeight:(int)height;@endImageHelper.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 intoCGContextRef 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 dataCGContextDrawImage(context, rect, imageRef);// Get a pointer to the dataunsigned 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 datafor(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 databitmapData = (uint32_t *)malloc(bufferLength);if(!bitmapData) {NSLog(@"Error allocating memory for bitmap\n");CGColorSpaceRelease(colorSpace);return NULL;}//Create bitmap contextcontext = CGBitmapContextCreate(bitmapData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast);// RGBAif(!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 providerNULL,// decodeYES,// should interpolaterenderingIntent);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 scaleif([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 bitmapunsigned char *bitmap = [ImageHelper convertUIImageToBitmapRGBA8:image]; // Create a UIImage using the bitmapUIImage *imageCopy = [ImageHelper convertBitmapRGBA8ToUIImage:bitmap withWidth:width withHeight:height]; // Display the image copy on the GUIUIImageView *imageView = [[UIImageView alloc] initWithImage:imageCopy]; // Cleanupfree(bitmap);
0 0
- 【Obj-C】UIImage与位图(RGBA8 Bitmaps)的相互转化
- UIImage与位图(RGBA8 Bitmaps)的相互转化
- Base64图片与UIImage的相互转化
- Base64图片与UIImage的相互转化
- Base64图片与UIImage的相互转化
- iOS Base64图片与UIImage的相互转化
- IOS中UIImage与UIColor相互转化
- iOS UIImage 和 NSString的相互转化
- NSString,NSData,Byte数组 ,UIImage的相互转化
- NSData与UIImage之间的相互转换
- IOS中uiimage和uicolor相互转化
- iOS中uiimage和uicolor相互转化
- UIImage和Base64格式图片相互转化!
- NSString, char, NSData,UIImage相互转化
- iOS - uiimage和uicolor相互转化
- UIImage与Iplimage相互转换
- NSData 与 NSString,Byte数组,UIImage 的相互转换
- NSdata 与 NSString,Byte数组,UIImage 的相互转换
- hdu 1257 最少拦截系统
- 右键功能
- Spring MVC和Struts2的比较
- HTML适应手机浏览器宽度
- Android PullToRefresh (ListView GridView 下拉刷新) 使用详解
- UIImage与位图(RGBA8 Bitmaps)的相互转化
- Makefile中的选项-I 和-L
- HDU 2853 Assignment【二分图最优匹配+巧妙权值】
- 甲骨文的最新咨询17修正安全漏洞在Java SE
- A+B for Input-Output Practice (V)
- android log系统
- 数据库视频总结(1)——为用户着想
- 甲骨文1z0-591考试题库
- GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流