OK 私は、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;
}
この方法は、リアルタイムで実行できるように高度に最適化されています。orig および changed 引数は、必要な制御点を持つ 2 つの float*float 行列です。ここでは、毎回 UIImage からピクセル データを取得し、CGImageRef、CGCOntextRef、ColorSpaceRef などを作成してから、再度解放する一定のオーバーヘッドが見られます。とにかく、これらを最適化できますか?可能であれば、他の可能なスピードアップを提案してください。しかし、私は OpenGL やシェーダーについてまったく知らないので、シェーダーを介してこれらを実行できない可能性があります。