カメラセッションがあり、バッファから画像を取得しています:
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)CMSampleBufferGetImageBuffer(sampleBuffer);
CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pixelBuffer];
//rotate image 90°
ciImage = [ciImage imageByApplyingTransform:CGAffineTransformMakeRotation(-M_PI/2.0)];
}
そして、私は画像にフィルターを適用しています。別のキューにフィルターを適用したいのですが、スレッドセーフではないため、画像を高速に取得すると、画像がブレンドされます(左から右に50/50、私は思う)、しかし、私はそれをスレッドセーフにしようとしています.NSLockまたはNSRecursiveLockを使用すると、画像がブレンドされるため、機能しません.
dispatch_async(filterQueue, ^{
CIImage *scaleImage = [CIFilter filterWithName:@"CILanczosScaleTransform" keysAndValues:kCIInputImageKey, ciImage, @"inputScale", [NSNumber numberWithFloat:0.5], nil].outputImage;
CGImageRef cgImage = [imageContext createCGImage:scaleImage fromRect:scaleImage.extent];
[self.pictureArray addObject:[UIImage imageWithCGImage:cgImage]];
CGImageRelease(cgImage);
});
誰かが私を助けることができますか?コードをスレッドセーフにする方法についてあまり知識がありません
画像は次のようにブレンドされます: http://i.stack.imgur.com/wjrIl.png