我正在使用Avfoundation捕获视频,我想裁剪捕获的UIImage的一部分。 我正在使用两个UIImageView。 layout
这是我创建视图的代码。
-(void)addCamToView
{
AVCaptureSession *session = [[AVCaptureSession alloc]init];
session.sessionPreset = AVCaptureSessionPresetPhoto;
AVCaptureDevice *device =
[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
[session addInput:input];
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
_stillImageOutput = [[AVCaptureStillImageOutput alloc]init];
[session addOutput:output];
[session addOutput:_stillImageOutput];
output.videoSettings =
@{ (NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA) };
AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
previewLayer.frame = _imv1.bounds;
previewLayer.videoGravity = AVLayerVideoGravityResize;
CALayer *ca_imv2 = _imv2.layer;
CALayer *ca_mainImv = _imv1.layer;
[previewLayer addSublayer:ca_mainImv];
[previewLayer addSublayer:ca_imv2];
[self.view.layer addSublayer:previewLayer];
[session startRunning];
}
当用户按下捕获按钮时,我正在运行此代码来捕获图像:
-(void) Capture: (UIImageView *)
{
AVCaptureConnection *videoConnection = nil;
for (AVCaptureConnection *connection in _stillImageOutput.connections)
{
for (AVCaptureInputPort *port in [connection inputPorts])
{
if ([[port mediaType] isEqual:AVMediaTypeVideo] )
{
videoConnection = connection;
break;
}
}
if (videoConnection) { break; }
}
[_stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer,NSError *error)
{
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
UIImage *image = [[UIImage alloc] initWithData:imageData];
UIImage *croppedImv = [self crop:imv2.frame: image];
self.imv1.image = croppedImv;
}];
}
这是我裁剪图片的代码。我想在UIImageView2
中提取图像的一部分- (UIImage *)crop:(CGRect)rect :(UIImage *)img {
CGImageRef imageRef = CGImageCreateWithImageInRect(img.CGImage, rect);
UIImage *result = [UIImage imageWithCGImage:imageRef scale:img.scale orientation: img.imageOrientation];
CGImageRelease(imageRef);
return result;
}
由于某种原因,裁剪后的图像永远不会是UIImageView2中的图像。我错过了什么吗?
由于
答案 0 :(得分:0)
让我看看我是否得到了这个
您想要在大图像视图中显示图像,然后您想要剪切该图像的一部分并以某种放大镜显示它。
当你在图像视图2中看到大图像的不同矩形时,这是正确的吗?
我猜这个问题是由于图像视图1内容模式(和/或图像视图内容模式。)
图像视图使用其contentMode属性和配置 图像本身决定了如何显示图像。最好是 指定尺寸与图像视图尺寸匹配的图像 确切地说,但图像视图可以缩放您的图像以适应所有或部分 可用空间。如果图像视图本身的大小发生变化,那就是它 根据需要自动缩放图像。
另一个问题可能是您用于裁剪图像的框架,这是因为视图框架表示视图的坐标与其超视图的关系。
在您的情况下,只有当图像视图1占据其超级视图的所有边界并且与图像视图2共享相同的超级视图时,该匹配才是正确的。