4

これまでのところ、それぞれの間隔が約3秒の複数の画像を撮影するiPhone用のアプリを作成することができました。私は各画像を別々のスレッドで非同期的に処理しており、iPhoneディスクに画像を保存する瞬間まですべてが素晴らしいです。次に、JPEG表現を使用して画像をディスクに保存するのに約12秒かかります。

Appleはどのようにそれを行っていますか、どのようにして単一の画像をディスクに非常に速く保存することができますか?彼らが使用しているトリックはありますか?アニメーションがしばらくの間ユーザーの気を散らすのを見ましたが、それでも必要な時間は12秒未満です!

前もって感謝します。

4

4 に答える 4

4

実際、アップルはカーネルドライバーAppleJPEGDriverを使用しています。これはハードウェアjpegエンコーディングAPIであり、ソフトウェアエンコーディング(JPEGRepresnetaion)やジェイルブレイクアプリ(サイコーダービデオレコーディングアプリケーション)で使用する人よりもはるかに高速です。Appleはユーザーに同じ機能を提供する必要がありますが、彼らはAppleです:)

于 2010-05-11T04:05:40.973 に答える
2

私はこれを試したことがありませんが、Appleが同じ方法を使用していないかどうかはわかりません。Appleの設計哲学の大部分は、操作の中断をユーザーから隠すことに依存しています。Appleのコードはあなたのコードと同じくらい時間がかかるかもしれませんが、単にユーザーの認識から全体の節約時間を隠すことに長けています。

誰かがAppleが実際にどのように速く節約するかをあなたに言うことができないなら、私は節約時間を偽装する方法を探すことを提案するでしょう。

于 2009-10-19T14:12:53.270 に答える
0

私は自分のアプリでこの問題を抱えていました。保存するとハングするので、GrandCentralディスパッチを使用しました。

以下は私の画像キャッシュクラスからのsetImageメソッドです。UIImageに画像がある場合はそれを保存し、そうでない場合は削除します。うまくいけば、これをニーズに合わせて調整できます。iOS4以降でのみ機能します。コードはARC対応です。

-(void)setImage:(UIImage *)image{
    if (image == nil){
    NSLog(@"Deleting Image");
    // Since we have no image let's remove the cached image if it exists
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                   NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
                   NSUserDomainMask, YES) objectAtIndex:0];
                   [[NSFileManager defaultManager] removeItemAtPath:[cachePath
                   stringByAppendingPathComponent:@"capturedimage.jpg"] error:nil];
                 });
    }
else {
      NSLog(@"Saving Image");
      // We've got an image, let's save it to flash memory.
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                     NSString *cachePath = 
                    [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
                    NSUserDomainMask, YES) objectAtIndex:0];
                    NSData *dataObj = UIImagePNGRepresentation(image);
                    [dataObj writeToFile:[cachePath 
                    stringByAppendingPathComponent:@"capturedimage.jpg"] atomically:NO];
                  });
     }

imageCache = image;

}
于 2012-05-19T23:42:15.987 に答える
0

あなたが少しググると...同じ問題を抱えている人がたくさんいます。

答えが見つかりませんでした。一般的な結論は、アップルが内部APIを使用し、パブリックAPIオーバーヘッドまたはハードウェアエンコーダーをバイパスすることであるように思われます。

画像をすばやく保存するのは運が悪いと思います

于 2009-10-19T07:44:15.377 に答える