我正在建造一个iPhone/iPad应用程序,可以进行一些用户交互式的图像处理。这基本上是一个依赖于触摸的功能,可以根据触摸重新塑造任何图像。在Facetune应用程序中也可以找到非常相似的功能。
我的算法需要根据触摸移动计算控制点。然后根据这些控制点,我生成了一个结果网格,用于插值图像。我的整个方法都运行得很好。唯一的问题是实时速度较慢。我正在使用...
在触摸移动函数中,但仍然很慢。将图像重新缩放到大约360×某些大小可以加速处理过程,但会牺牲图像质量。
我的触摸移动代码是:
方法“wrappingInterpolation”对图像像素进行实际的图像处理,该方法经过高度优化,可能以实时方式运行。orig和changed参数只是我需要的两个浮点*浮点矩阵控制点。我在这里看到了一个恒定的开销,每次都从UIImage获取像素数据,然后创建CGImageRef、CGCOntextRef、ColorSpaceRef等,然后再释放它。 有什么方法可以进行优化吗? 如果可能的话,请提出任何其他可能的加速建议。但是我对OpenGL或着色器没有什么概念,所以可能无法通过着色器进行优化。
我的算法需要根据触摸移动计算控制点。然后根据这些控制点,我生成了一个结果网格,用于插值图像。我的整个方法都运行得很好。唯一的问题是实时速度较慢。我正在使用...
dispatch_async(dispatch_get_main_queue(), ^{
在触摸移动函数中,但仍然很慢。将图像重新缩放到大约360×某些大小可以加速处理过程,但会牺牲图像质量。
我的触摸移动代码是:
- (void)updateImage
{
int bytesPerRow = CGImageGetBytesPerRow([staticBG.image CGImage]);
int height = CGImageGetHeight([staticBG.image CGImage]);
int width = CGImageGetWidth([staticBG.image CGImage]);
CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider([staticBG.image CGImage]));
unsigned char *baseImage = (unsigned char *)CFDataGetBytePtr(pixelData);
unsigned char *output_image;
output_image = [self wrappingInterpolation :baseImage :orig :changed :width :height :bytesPerRow];
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;
CGContextRef context = CGBitmapContextCreate(output_image, width, height, 8, bytesPerRow, colorSpaceRef, bitmapInfo);
CGImageRef imageRef = CGBitmapContextCreateImage (context);
UIImage *newimage = [UIImage imageWithCGImage:imageRef];
CGColorSpaceRelease(colorSpaceRef);
CGContextRelease(context);
CFRelease(imageRef);
free(output_image);
resultView.image = newimage;
//staticBG.hidden = YES;
}
方法“wrappingInterpolation”对图像像素进行实际的图像处理,该方法经过高度优化,可能以实时方式运行。orig和changed参数只是我需要的两个浮点*浮点矩阵控制点。我在这里看到了一个恒定的开销,每次都从UIImage获取像素数据,然后创建CGImageRef、CGCOntextRef、ColorSpaceRef等,然后再释放它。 有什么方法可以进行优化吗? 如果可能的话,请提出任何其他可能的加速建议。但是我对OpenGL或着色器没有什么概念,所以可能无法通过着色器进行优化。