【问题标题】:Overlay an image (UIImageView) into photo将图像(UIImageView)叠加到照片中
【发布时间】:2019-07-12 04:56:21
【问题描述】:

有没有办法在拍照时集成 UIImageView?

我似乎找不到讨论这个的话题。

我想做的是在预览上叠加一个 UIImageView。当快门被点击时,它应该拍摄嵌入 UIImageView 的照片。

这就是我现在的位置。 “测试图像”部分将可拖动到预览视图的顶部。我想将该图像包含在按下快门按钮时将要拍摄的图像中。

这可能吗?还是有更好的办法?

我正在使用 AVCaptureVideoPreviewLayer、AVCaptureSession 和 AVCapturePhotoOutput。我只是将 UIIMageView 放在 UIView 之上,其中 AVCaptureVideoPreviewLayer 也是一个子视图。

编辑:测试将 UIView 保存为图像,它不包括预览层(仅返回 UIView + UIImageView 叠加层)。

【问题讨论】:

  • 不清楚您要做什么,请用更详细的描述更新您的问题
  • 我会附上一张图片来描述我想要做什么。
  • 您可以在相机处于活动状态时将星图添加为子视图,或者如果您正在使用 UIImagePickerController,则可以将星图添加为叠加视图。捕获图像并导航到预览模式后,将星图视图放置在与相机屏幕相同的位置。一旦需要分享/保存图片,则需要将此星图作为水印添加到图片中的同一位置。
  • 如果您可以添加一些有关当前视图层次结构以及您如何准确捕获图像的更多信息(您是否使用AVCaptureVideoPreviewLayer?),这将非常有帮助

标签: ios swift avfoundation


【解决方案1】:

至少有两种方法可以做到这一点。

1) 从相机拍摄照片并根据可拖动的图像视图位置添加叠加图像。这将产生最好的质量。

2) 如果您不需要照片质量,您可以使用其他解决方案 - 在图形上下文和视频预览层中渲染可拖动视图层:

func takePhotoWithOverlay() -> UIImage? {
    let overlayImageView // UIImageView with overlay image
    let videoPreviewLayer // AVCaptureVideoPreviewLayer

    guard let superview = overlayImageView.superview else { return nil }

    UIGraphicsBeginImageContextWithOptions(superview.bounds.size, false, 0.0)
    defer { UIGraphicsEndImageContext() }

    guard let context = UIGraphicsGetCurrentContext() else { return nil }

    videoPreviewLayer.render(in: context)
    overlayImageView.layer.render(in: context)

    return UIGraphicsGetImageFromCurrentImageContext()
}

【讨论】:

  • 谢谢!最后。我实际上已经得出第一个结论,但我会尝试您提供的第二个选项,因为照片质量并不是最重要的,而且我们实际上在上传过程中缩小了图像。
  • 你有方法1)的例子吗?
猜你喜欢
  • 2011-05-11
  • 2020-11-28
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多