2011-11-16 5 views
9

私はAVFoundationカメラでズーム機能を使用しています。私はAVCaptureVideoPreviewLayerを持つビューを拡大縮小してズームを実装しました。 ズームした画像をキャプチャします。ここAVFoundationでズームプレビュービューをキャプチャ

は、ビューにAVFoundationVideoPreviewLayerを追加するための私のコードです:

// zoom the preview view using core graphics 
[previewView setTransform:CGAffineTransformMakeScale(2.0, 2.0)]; 

プレビュービューをズームするための

// create a uiview subclass for showing the camera feed 
UIView *previewView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 430)]; 
[[self view] addSubview:previewView]; 

CGRect layerRect = CGRectMake(0, 0, 320, 430); 
[[self avCaptureVideoPreviewLayer] setBounds:layerRect]; 

[[self previewLayer] setPosition:CGPointMake(CGRectGetMidX(layerRect), CGRectGetMidY(layerRect))]; 

// add the video previewview layer to the preview view 
[[previewView layer] addSublayer:[self avCaptureVideoPreviewLayer]]; 

コード今私はpreviewViewから事前に

感謝をこのズーム画像をキャプチャしたいです。

答えて

7

最後に、私は拡大した写真をアプリケーションに追加することができました。それは少し醜いですが、それは動作します。私はネットからUIImage +サイズ変更コードを使用し、画像をズームスケールにスケーリングし、ズームした領域のオフセット位置を[カメラビューで表示]に計算して切り取った。

ズームスケールが最大で6倍のときにアプリがクラッシュすることがあります。ズームした画像が大きすぎるため、私はメモリの問題を受けています。私は別の質問としてこれを尋ねます。

このコードを参考にしてください。

if (cameraZoom > 1.0) 
{ 
     // save the images original size 
     CGSize orgSize = [image size]; 

     // resize the image to the zoom scale 
     image = [image resizedImage:CGSizeMake(image.size.width * cameraZoom, image.size.height *cameraZoom) interpolationQuality:kCGInterpolationNone];   

     // now calculate the offset x and offset y 
     CGFloat offsetX = (image.size.width/2) - (orgSize.width /2) ; 
     CGFloat offsetY = (image.size.height/2) - (orgSize.height /2); 

     // crop the image from the offset position to the original width and height 
     image = [image croppedImage:CGRectMake(offsetX, offsetY, orgSize.width, orgSize.height)]; 
    } 


    UIButton *imgBtn = (UIButton *)[self.view viewWithTag:500]; 
    [imgBtn setImage:image forState:UIControlStateNormal]; 
+0

その他の優れたソリューションはありますか? – kadungon

+1

クラッシュについて:メモリの問題を解決するには、サイズ変更よりも先にトリミングするだけです。大部分の画像を後で削除すると大きな画像を計算しないでください。 – CipherCom

+0

私はあなたにコードを試みましたが、私はcameraZoomを理解できず、最終結果は常に空白の画像です。もっと共有していただけますか? –

2

最初にトリミングしてからサイズを変更すると、メモリの問題は解決しません。

あなたが今やっていることは次のようなものです: 600x600の画像は6xのときには3600x3600になり、次に600X600になるとそれをトリミングします。 しかし、6Xの作物で600X600を試してみて100X100にしてから、600X600に再度サイズ変更してみてください。

元の解像度が低い場合、両方のプロセスの出力イメージが少し異なる可能性がありますが、元の解像度が8MP/5MP/3MP(最高5/4秒/ 4/3G)の場合、出力はほぼ同じになる可能性があります。

したがって、より良い結果を得るには、低解像度と高解像度の場合は、上記の逆の処理を使用してください。

0

最初にクロッピングを行い、次にコアグラフィックス画像変換を使用してズームすることができました。元の画像サイズとスケールを画像バッファに保存し、個々のピクセルの変換操作でズーム機能を完全に実行することに注意してください。

UIGraphicsBeginImageContextWithOptions(imageSize,NO,1.0); // this will crop 

CGContextRef context = UIGraphicsGetCurrentContext(); 


CGRect newRect = CGRectMake(0, 0, width, height); 

// apply a scaling transform to zoom 
// rotate about the center 
// First we scale, then rotate, then translate 
// actual matrix multiplication steps are applied in reverse when using 
// right-handed coordinate system 
// M' = M * translatation * rotation * scale 
CGContextTranslateCTM(context, (width - scaledWidth)*0.5f, 
           (height-scaledHeight)*0.5f); 
CGContextScaleCTM(context,scaleFactor,scaleFactor); 

[sourceImage drawInRect:newRect]; 

newImage = UIGraphicsGetImageFromCurrentImageContext(); 
if (newImage == nil) { 
    NSLog(@"could not scale image"); 
} 

// pop the context to get back to the default 
UIGraphicsEndImageContext(); 
4

を私は画像のスケールやクロップを設定しています:このコード変換(私の場合、私は唯一の直立現在、肖像を使用)アカウントに、デバイスの向きを取ることはありませんが、簡単に追加の回転を達成することができることに注意してください

これはビデオ接続でのみ動作すると思われますが、静止画の場合はチャームのようにも動作します。

+1

これは正解です。2行のコードと完璧に動作します。ありがとう、ホセ! – picciano

関連する問題