Я использую Avfoundation для захвата видео, и я хотел бы обрезать одну часть захваченного UIImage. Я использую два UIImageView. layoutiOS урожай одной части UIImage
Вот мой код для создания представления.
-(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. Я что-то упускаю?
Thanks
Спасибо andrea за ваш ответ. Это именно то, что я пытаюсь сделать. Моя конечная цель - сделать некоторые операции с захваченным изображением в imageView2. Я показываю его в imageView1, чтобы быть уверенным, что я обрезал правый раздел. Imageview1 является родительским элементом imageView2, а imageView1 - подвид главного UIView и имеет тот же фрейм, что и основной UIView. Как я могу получить правильную координату UIimageView2, чтобы иметь возможность обрезать изображение? – armand
Добавление subview в uiimageview невозможно в построителе интерфейса только в коде. Вы создаете свой интерфейс в построителе интерфейса или коде? – Andrea
Я создаю интерфейс в коде. Я изменил код, чтобы добавить imv2 в previewLayer следующим образом: CALayer * ca_imv2 = _imv2.layer; CALayer * ca_imv1 = _imv1.layer; [previewLayer addSublayer: ca_imv1]; [previewLayer addSublayer: ca_imv2]; и у меня такая же проблема, как вы были правы, проблема связана, вероятно, потому, что если я добавлю: _imv2.center = _imv1.center; imv2 не находится в центре imv1, но я не понимаю, что я делаю неправильно, я думаю, что я чего-то не хватает. Спасибо – armand