I am working with zoom functionality in AVFoundation camera, i have implemented zoom by scaling the view that has AVCaptureVideoPreviewLayer. Now i want to capture the zoomed image.
here is my code for adding AVFoundationVideoPreviewLayer to view:
// 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]];
code for zooming preview view
// zoom the preview view using core graphics
[previewView setTransform:CGAffineTransformMakeScale(2.0, 2.0 )];
Now i want to capture this zoomed image from previewView
Thanks in advance.
Finally i have managed to add capturing zoomed photo in my app. Its a bit ugly but it works. I used UIImage+resize code from the net and then scaled the image to zoom scale, and the calculated the offset position for the zoomed region [that is visible in the camera view] and then i cropped it.
Now my app crashes sometimes when the zoom scale is at max i.e. at 6x. I am receiving memory problem as the zoomed image is too big, i will ask this as a another question.
Hoping this code might be usefull for someone.
I was able to accomplish cropping first and then zooming using core graphics image transforms. Notice that we keep the original image size and scale in the image buffer and do the zoom feature completely with transform operations on the individual pixels. Note that this code does not take into account the device orientation (in my case I only use portrait upright currently), but could easily be accomplished with an additional rotation transform:
I'm setting image scale and crop directly with:
It supposed to work only with video connections but for still image works also like a charm.
You should try crop first and then resize, that way you will not memory problem.
What you are doing now is like: 600X600 image will become 3600X3600 when 6x, then you crop it, that will give 600X600 again. But, why dont you try 600X600 with crop of 6x gives 100X100, then resize it to 600X600 again.
It may possible that if original resolution is low then output image of both process differ a bit, but if original resolution is 8MP/5MP/3MP (highest in 5/4s/4/3G) then output will be nearly similar.
So, to get better result, use you process when low resolution and for high resolution use reverse one that I suggested above.