gpt4 book ai didi

ios - AVFoundation 图像捕获 - 准确捕获用户在 UIImage 中看到的内容

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:19:05 24 4
gpt4 key购买 nike

我知道之前有人问过这个问题,我已经在这里尝试了这个问题的所有答案,我认为这其中有一些我不理解的基本问题,所以到目前为止我的努力没有结果。我希望有人能让我觉得自己是个白痴,因为我为此而苦苦挣扎,并为我指明正确的方向。

我想做的就是用 AVCaptureSession 捕捉一个方形的 UIImage 并将其显示在缩略图 View 中,看起来与视频层中的区域完全相同。图像捕获工作正常,但是,当将图像添加到我的缩略图 View 时,图像的顶部和底部会展开以显示用户不可见的 AvCaptureVideoPreviewLayer 中的照片区域。

以下代码初始化我的 session ,一切正常,但也许我需要在此处更改一些内容以仅捕获用户可见的提要部分:

-(void)setupFeed
{
self.session = [[AVCaptureSession alloc] init];

self.session.sessionPreset = AVCaptureSessionPresetPhoto;
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
if([self.session canAddInput:deviceInput])
{
[self.session addInput:deviceInput];
}

self.cameraPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.session];
[self.cameraPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
CALayer *rootLayer = [[self view] layer];
[rootLayer setMasksToBounds:YES];
CGRect frame = self.cameraPreview.frame;
[self.cameraPreviewLayer setFrame:frame];
[rootLayer insertSublayer:self.cameraPreviewLayer atIndex:0];

self.imageOutput = [[AVCaptureStillImageOutput alloc] init];
NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG, AVVideoCodecKey, nil];
[self.imageOutput setOutputSettings:outputSettings];

[self.session addOutput:self.imageOutput];

[self.session startRunning];
}

下一段代码是捕捉我的图像,这段代码也可以,裁剪到一边:

[self.imageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error)
{

if(imageDataSampleBuffer != NULL)
{
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
self.snappedImage = [UIImage imageWithData:imageData];
[self.snappedImage crop:self.snappedImageView.layer.frame];
[self.session stopRunning];;
}

dispatch_async(dispatch_get_main_queue(),
^{
[self presentSnappedImageOptions];
});
}];
}

-(void)presentSnappedImageOptions
{
[self.imagePreview setImage: self.snappedImage];
}

...最后是我用来尝试将图像裁剪为与可见视频层相同的 UIImage 类别方法:

@implementation UIImage (Crop)

- (UIImage *)crop:(CGRect)rect
{

rect = CGRectMake(rect.origin.x*self.scale,
rect.origin.y*self.scale,
rect.size.width*self.scale,
rect.size.height*self.scale);

CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], rect);
UIImage *result = [UIImage imageWithCGImage:imageRef
scale:self.scale
orientation:self.imageOrientation];
CGImageRelease(imageRef);
return result;
}

@end

我们将不胜感激任何帮助。

最佳答案

我不知道您的 View 是如何布局的,但也许您使用的裁剪矩形“self.snappedImageView.layer.frame”与预览层显示的捕获图像区域不对应。

据我所知,预览层的框架是正方形的,对吧,并且由于它的视频引力是纵横比填充的,我认为您可以为图像获取最大的居中正方形并将其用作裁剪矩形。

你试试这个矩形怎么样

CGSize size = image.size;
CGFloat side = fminf(size.width,size.height); //just the smaller dimension
CGrect croppingRect = CGRectMake((size.width-side)/2.f,(size.height-side)/2.f,side,side);

关于ios - AVFoundation 图像捕获 - 准确捕获用户在 UIImage 中看到的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27428030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com