留下日后学习
- (UIImage*) applyFilter:(FilterCallback)filter context:(void*)context
{
CGImageRef inImage = self.CGImage;
size_t width = CGImageGetWidth(inImage);
size_t height = CGImageGetHeight(inImage);
size_t bits = CGImageGetBitsPerComponent(inImage);
size_t bitsPerRow = CGImageGetBytesPerRow(inImage);
CGColorSpaceRef colorSpace = CGImageGetColorSpace(inImage);
int alphaInfo = CGImageGetAlphaInfo(inImage);
if (alphaInfo != kCGImageAlphaPremultipliedLast &&
alphaInfo != kCGImageAlphaNoneSkipLast) {
if (alphaInfo == kCGImageAlphaNone ||
alphaInfo == kCGImageAlphaNoneSkipFirst) {
alphaInfo = kCGImageAlphaNoneSkipLast;
}else {
alphaInfo = kCGImageAlphaPremultipliedLast;
}
CGContextRef context = CGBitmapContextCreate(NULL,
width,
height,
bits,
bitsPerRow,
colorSpace,
alphaInfo);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), inImage);
inImage = CGBitmapContextCreateImage(context);
CGContextRelease(context);
}else {
CGImageRetain(inImage);
}
CFDataRef m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage));
int length = CFDataGetLength(m_DataRef);
CFMutableDataRef m_DataRefEdit = CFDataCreateMutableCopy(NULL,length,m_DataRef);
CFRelease(m_DataRef);
UInt8 * m_PixelBuf = (UInt8 *) CFDataGetMutableBytePtr(m_DataRefEdit);
for (int i=0; i<length; i+=4)
{
filter(m_PixelBuf,i,context);
}
CGImageRelease(inImage);
CGContextRef ctx = CGBitmapContextCreate(m_PixelBuf,
width,
height,
bits,
bitsPerRow,
colorSpace,
alphaInfo
);
CGImageRef imageRef = CGBitmapContextCreateImage(ctx);
CGContextRelease(ctx);
UIImage *finalImage = [UIImage imageWithCGImage:imageRef
scale:self.scale
orientation:self.imageOrientation];
CGImageRelease(imageRef);
CFRelease(m_DataRefEdit);
return finalImage;
}
void filterBrightness(UInt8 *pixelBuf, UInt32 offset, void *context)
{
double t = *((double*)context);
int r = offset;
int g = offset+1;
int b = offset+2;
int red = pixelBuf[r];
int green = pixelBuf[g];
int blue = pixelBuf[b];
pixelBuf[r] = SAFECOLOR(red*t);
pixelBuf[g] = SAFECOLOR(green*t);
pixelBuf[b] = SAFECOLOR(blue*t);
}
- (UIImage*)brightness:(double)value
{
return [self applyFilter:filterBrightness context:&value];
}