好的,我正在构建这个应用程序,它在 iPhone/iPad 中进行一些用户交互式图像操作。这基本上是一个依赖于触摸的函数,它根据触摸重新塑造任何图像。在应用程序 Facetune 中可以找到非常相似的东西。
我的算法需要根据触摸运动计算控制点。然后基于这些控制点,我生成一个用于插入图像的结果网格。我的整个方法运行良好。唯一的问题是实时速度很慢。我在用
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 参数只是两个 float*float matix ,它具有我需要的控制点。我在这里看到一个恒定的开销,每次都从 UIImage 获取像素数据,然后创建 CGImageRef、CGContextRef、ColorSpaceRef 等。然后再次释放它。无论如何我可以优化这些?如果可能,建议任何其他可能的加速。但我真的不知道 OpenGL 或着色器,所以我可能无法通过着色器来完成这些。