iOS GPUImage图片处理性能比对
来源:互联网 发布:java开源网盘系统源码 编辑:程序博客网 时间:2024/04/28 17:59
demo:http://download.csdn.net/detail/xoxo_x/9704542
待处理图片:(12K)
处理之后的图片:
CPU为图片添加滤镜代码@
CoreImage为图片添加滤镜代码@
GPUImage为图片添加滤镜代码@
分别使用CPU、CoreImage、GPUImage 对同一张照片进行相同效果的滤镜处理。
处理时间:
第一次:
第二次:
从图中,我们了解到目前有:如下结果
处理效率(性能):CPU >= GPUImage 》CoreImage
当然这是小图片的处理结果,图片大小为12k
下面换一张大点的图片
待处理图片:(970 KB)
处理之后的图片:
时间:
结论如上:处理效率(性能):CPU >= GPUImage 》CoreImage
当cpu进行逻辑处理的时候,你不能要求他去做图像运算,否则会影响计算机的性能,所以这时候使用GPU来进行图形运算,会有好一点的效果,基本上运算时间持平,GPU是为图像处理而专门存在的,GPUImage,基于opengl,opengl是基于Gpu的,因此
测试和写入文件代码:
UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"]; UIImage *imageFilteredUsingCPURoutine = [self imageProcessedOnCPU:inputImage]; [self writeImage:imageFilteredUsingCPURoutine toFile:@"Lambeau-CPUFiltered.png"]; // Pulling creating the Core Image context out of the benchmarking area, because it can only be created once and reused //创建 Core Image 上下文 , if (coreImageContext == nil) { coreImageContext = [CIContext contextWithOptions:nil]; } UIImage *imageFilteredUsingCoreImageRoutine = [self imageProcessedUsingCoreImage:inputImage]; [self writeImage:imageFilteredUsingCoreImageRoutine toFile:@"Lambeau-CoreImageFiltered.png"]; UIImage *imageFilteredUsingGPUImageRoutine = [self imageProcessedUsingGPUImage:inputImage]; [self writeImage:imageFilteredUsingGPUImageRoutine toFile:@"Lambeau-GPUImageFiltered.png"]; [self.tableView reloadData];- (void)writeImage:(UIImage *)imageToWrite toFile:(NSString *)fileName;{ if (imageToWrite == nil) { return; } NSData *dataForPNGFile = UIImagePNGRepresentation(imageToWrite); NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSLog(@"documentsDirectory ,%@",documentsDirectory); NSError *error = nil; if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:fileName] options:NSAtomicWrite error:&error]) { return; }}
CPU处理代码
- (UIImage *)imageProcessedOnCPU:(UIImage *)imageToProcess;{ // Drawn from Rahul Vyas' answer on Stack Overflow at http://stackoverflow.com/a/4211729/19679 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;}
CoreImage处理代码
- (UIImage *)imageProcessedUsingCoreImage:(UIImage *)imageToProcess;{ /* NSArray *filterNames = [CIFilter filterNamesInCategory:kCICategoryBuiltIn]; NSLog(@"Built in filters"); for (NSString *currentFilterName in filterNames) { NSLog(@"%@", currentFilterName); } */ CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent(); CIImage *inputImage = [[CIImage alloc] initWithCGImage:imageToProcess.CGImage]; CIFilter *sepiaTone = [CIFilter filterWithName:@"CISepiaTone" keysAndValues: kCIInputImageKey, inputImage, @"inputIntensity", [NSNumber numberWithFloat:1.0], nil]; CIImage *result = [sepiaTone outputImage];// UIImage *resultImage = [UIImage imageWithCIImage:result]; // This gives a nil image, because it doesn't render, unless I'm doing something wrong CGImageRef resultRef = [coreImageContext createCGImage:result fromRect:CGRectMake(0, 0, imageToProcess.size.width, imageToProcess.size.height)]; UIImage *resultImage = [UIImage imageWithCGImage:resultRef]; CGImageRelease(resultRef); elapsedTime = CFAbsoluteTimeGetCurrent() - startTime; processingTimeForCoreImageRoutine = elapsedTime * 1000.0; return resultImage;}
GPUImage处理代码
- (UIImage *)imageProcessedUsingGPUImage:(UIImage *)imageToProcess;{ CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent(); GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:imageToProcess]; GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init]; [stillImageSource addTarget:stillImageFilter]; [stillImageFilter useNextFrameForImageCapture]; [stillImageSource processImage]; UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentFramebuffer]; elapsedTime = CFAbsoluteTimeGetCurrent() - startTime; processingTimeForGPUImageRoutine = elapsedTime * 1000.0; return currentFilteredVideoFrame;}
需要导入头文件
#import "ImageFilteringBenchmarkController.h"#import "GPUImage.h"
需要的本地库:
1 0
- iOS GPUImage图片处理性能比对
- iOS-图片处理 by GPUImage 滤镜
- iOS 图片处理-利用GPUImage 磨皮和美白图片
- iOS GPUImage图像处理
- iOS之GPUImage图片处理框架的使用
- GPUImage混合滤镜处理图片
- iOS GPUImage 添加到工程 使用GPUImage渲染图片教程
- 关于iOS开发中图片处理的一些积累(CoreGraphic、CoreImage、GPUImage、OpenGL)
- ios 对图片的处理
- iOS GPUImage研究一:图片滤镜
- iOS:GPUImage强大的图像处理框架
- JSON性能比对
- 图片比对搜索
- c#图片比对
- iOS 对图片进行压缩处理
- IOS中对图片的处理 UIImage
- iOS CGImageRef 对图片进行处理
- iOS对图片进行马赛克处理
- IO操作中关闭流的注意点(多个关闭时的异常需要单独处理)
- Delmia二次开发 第三方库(LNK2019)
- 新人必须掌握的五大Linux终端命令
- qemu暂停cpu等待gdb
- svm的数学推导原理
- iOS GPUImage图片处理性能比对
- Linux中awk命令
- Android启动页欢迎界面大全 (网址)
- Bootstrap学习总结笔记(12)-- 基本组件之分页
- Professional JavaScript for Web Developers 读书笔记(七)
- [MFC]CPen画笔类、CBrush画刷类使用介绍
- 关系查询处理和查询优化
- CSS 居中方法
- DirectX开发环境的快速配置