菜鸟教程小白 发表于 2022-12-13 03:57:35

ios - AVFoundation Image Capture - 准确捕捉用户在 UIImage 中看到的内容


                                            <p><p>我知道以前有人问过这个问题,我已经在这里尝试了这个问题的所有答案,我认为这有一些基本的东西我不明白,所以到目前为止我的努力是徒劳的。我希望有人能让我觉得自己像个白痴一样为此挣扎,并为我指明正确的方向。 </p>

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

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

<pre><code>-(void)setupFeed
{
    self.session = [ init];

    self.session.sessionPreset = AVCaptureSessionPresetPhoto;
    AVCaptureDevice *device = ;
    AVCaptureDeviceInput *deviceInput = ;
    if()
    {
      ;
    }

    self.cameraPreviewLayer = [ initWithSession:self.session];
    ;
    CALayer *rootLayer = [ layer];
    ;
    CGRect frame = self.cameraPreview.frame;
    ;
    ;

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

    ;

    ;
}
</code></pre>

<p>下一段代码是捕获我的图像,这段代码也可以,裁剪到一边:</p>

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

      if(imageDataSampleBuffer != NULL)
      {
            NSData *imageData = ;
            self.snappedImage = ;
            ;
            ;;
      }

      dispatch_async(dispatch_get_main_queue(),
      ^{
            ;
      });
    }];
}

-(void)presentSnappedImageOptions
{
    ;
}
</code></pre>

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

<pre><code>@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(, rect);
    UIImage *result = [UIImage imageWithCGImage:imageRef
                                          scale:self.scale
                                    orientation:self.imageOrientation];
    CGImageRelease(imageRef);
    return result;
}

@end
</code></pre>

<p>我们将不胜感激任何帮助。 </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我不知道您的 View 是如何布局的,但也许您正在使用的裁剪矩形“self.snappedImageView.layer.frame”与预览层显示的捕获图像的区域不对应。 </p>

<p>据我了解,预览层的框架是正方形的,对,并且由于它的视频重力是纵横比填充的,我认为您可以获取图像的最大中心正方形并将其用作裁剪矩形。</p>

<p>你试试这个矩形怎么样</p>

<pre><code>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);
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - AVFoundation Image Capture - 准确捕捉用户在 UIImage 中看到的内容,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/27428030/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/27428030/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - AVFoundation Image Capture - 准确捕捉用户在 UIImage 中看到的内容