来自 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>;