1

解凍時に時間とメモリを節約し、アプリのダーティ メモリ フットプリントを減らすために、生の画像データを iOS のディスクに保存してロードする方法はありますか?

Paul Haddad はこのようなことをほのめかしており、この手法がOpenGL での効率的なゲーム テクスチャの読み込みに使用されていることを理解しています。

私の使用例は、ユーザーが提供する全画面の壁紙の場合で、常に背景に表示されます。現在、PNG に保存し、アプリの起動時に読み込みます。これにより、イメージの解凍にメモリと CPU が浪費されます。イメージを保存し、後でメモリ マップ ファイルとしてロードしたいと考えています。CoreGraphics/UIKit ランドでこれを達成する方法はありますか?

4

1 に答える 1

1

これを使用して、ビデオ バッファーのスライスをリアルタイムで保存しました。

 -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer  fromConnection:(AVCaptureConnection *)connection
{

  CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
  CVPixelBufferLockBaseAddress(imageBuffer,0);
  bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
  void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);

  size_t sliceSize = bytesPerRow*sliceWidth*sizeof(char);
  int slicePos= bytesPerRow*sliceStart*sizeof(char);
  NSData *rawFrame = [NSData dataWithBytes:(void*)baseAddress+slicePos length:sliceSize];

  inputPath = [NSString stringWithFormat:@"%@%@%d", NSTemporaryDirectory(), @"slice",step];
  [[NSData dataWithData:rawFrame] writeToFile:inputPath atomically:NO];
}

それから私はそれを読み返しました

-(void)readSlice
{
  //read slice i
  NSString *filePath = [NSString stringWithFormat:@"%@%@%d", NSTemporaryDirectory(), @"slice",i];            
  char* imgD= (char*)malloc(sliceSize);
  [[NSData dataWithContentsOfFile:filePath] getBytes:imgD];
  CGContextRef context = CGBitmapContextCreate(imgD, sliceHeight,sliceWidth, 8, bytesPerRad, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
  CGImageRef quartzImage = CGBitmapContextCreateImage(context);
  CGContextRelease(context);
  free(imgD);
  //do something with quartzImage
}
于 2012-11-06T17:42:05.117 に答える