图像处理之CPU图片滤镜

来源:互联网 发布:以网络为话题的作文 编辑:程序博客网 时间:2024/05/23 01:01

处理之前的图片

这里写图片描述

// 灰色处理 Here is the code for sepia image

- (UIImage *)imageProcessedOnCPU:(UIImage *)imageToProcess;{    CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent();    CGImageRef cgImage = [imageToProcess CGImage];    CGImageRetain(cgImage);    CGDataProviderRef provider = CGImageGetDataProvider(cgImage);    CFDataRef bitmapData = CGDataProviderCopyData(provider);    UInt8* data = (UInt8*)CFDataGetBytePtr(bitmapData);     CGImageRelease(cgImage);    int width = imageToProcess.size.width;    int height = imageToProcess.size.height;    NSInteger myDataLength = width * height * 4;    for (int i = 0; i < myDataLength; i+=4)    {        UInt8 r_pixel = data[i];        UInt8 g_pixel = data[i+1];        UInt8 b_pixel = data[i+2];        int outputRed = (r_pixel * .393) + (g_pixel *.769) + (b_pixel * .189);        int outputGreen = (r_pixel * .349) + (g_pixel *.686) + (b_pixel * .168);        int outputBlue = (r_pixel * .272) + (g_pixel *.534) + (b_pixel * .131);        if(outputRed>255)outputRed=255;        if(outputGreen>255)outputGreen=255;        if(outputBlue>255)outputBlue=255;        data[i] = outputRed;        data[i+1] = outputGreen;        data[i+2] = outputBlue;    }    CGDataProviderRef provider2 = CGDataProviderCreateWithData(NULL, data, myDataLength, NULL);    int bitsPerComponent = 8;    int bitsPerPixel = 32;    int bytesPerRow = 4 * width;    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;    CGImageRef imageRef = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider2, NULL, NO, renderingIntent);    CGColorSpaceRelease(colorSpaceRef);    CGDataProviderRelease(provider2);    CFRelease(bitmapData);    UIImage *sepiaImage = [UIImage imageWithCGImage:imageRef];    CGImageRelease(imageRef);    elapsedTime = CFAbsoluteTimeGetCurrent() - startTime;    processingTimeForCPURoutine = elapsedTime * 1000.0;    return sepiaImage;}

调用

UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"];[self imageProcessedOnCPU:inputImage];

处理之后的图片

这里写图片描述

黑白处理 Here is the code for Black & White effect

- (UIImage*) createGrayCopy:(UIImage*) source {    int width = source.size.width;    int height = source.size.height;    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();    CGContextRef context = CGBitmapContextCreate (nil,                              width,                                                height,                                                  8,      // bits per component                                                  0,                                                  colorSpace,                                                  kCGImageAlphaNone);    CGColorSpaceRelease(colorSpace);    if (context == NULL) {        return nil;    }    CGContextDrawImage(context,                       CGRectMake(0, 0, width, height), source.CGImage);    UIImage *grayImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];    CGContextRelease(context);    return grayImage;}
0 0
原创粉丝点击