0

次のコードを使用して、ムービーのフレームをデスクトップに保存しています。

NSCIImageRep *imageRep = [NSCIImageRep imageRepWithCIImage:[CIImage imageWithCVImageBuffer:imageBuffer]];
NSImage *image = [[[NSImage alloc] initWithSize:[imageRep size]] autorelease];
[image addRepresentation:imageRep];
CVBufferRelease(imageBuffer);

NSArray *representations = [image representations];
NSData *bitmapData = [NSBitmapImageRep representationOfImageRepsInArray:representations usingType:NSJPEGFileType properties:nil];
[bitmapData writeToFile:@"/Users/ricky/Desktop/MyImage.jpeg" atomically:YES];

コードの最後の 2 行目で、コンソールに次のメッセージが表示され、結果はデスクトップに保存されません。

<Error>: CGImageDestinationFinalize image destination does not have enough images
CGImageDestinationFinalize failed for output type 'public.jpeg'

NSImage は依然としてメソッド呼び出し全体に割り当てられたオブジェクトであるため、画像の量が不十分であるという苦情を受けている理由がわかりません。

助けていただければ幸いです。前もってありがとう、リッキー。

4

2 に答える 2

3

問題の原因は、NSCIImageRepオブジェクトの配列をrepresentationOfImageRepsInArray:usingType:properties:に渡していることだと思います。これは、NSBitmapImageRepオブジェクトの配列を期待していると思います。

やりたいことは、CIImage から NSBitmapImageRep を作成することです。次に、それを使用してディスクに書き込むことができます。それはおおよそ次のようになります。

CIImage *myImage = [CIImage imageWithCVImageBuffer:imageBuffer]; 
NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCIImage:myImage];
NSData *jpegData [bitmapRep representationUsingType:NSJPEGFileType properties:nil];
[jpegData writeToFile:@"/Users/ricky/Desktop/MyImage.jpeg" atomically:YES];

もちろん、すべてのエラー ケースを処理し、プロパティ ディクショナリを渡して JPEG の作成を微調整する必要があります。

于 2010-02-26T17:08:40.067 に答える
1

申し訳ありませんが、コードが機能しない理由はよくわかりませんが、別の方法でアプローチします(少し低いレベルではありますが、CVImageBufferからCIImage、NSCIImageRep、NSImage、NSDataよりも効率的だと思います): -

  1. CVImageBuffer から CGImage
  2. CGImageからjpgファイルへ

これを行うためのコードは用意していませんが、これらの例から適切なものを抽出するのは簡単です。

于 2010-02-26T15:48:50.513 に答える