【问题标题】:Save Image with animated gif placed on it保存带有动画 gif 的图像
【发布时间】:2019-08-11 02:11:55
【问题描述】:

我正在创建一个类似 instagram 的功能,您可以在其中添加可拖动的文本、贴纸和 gif。 我可以添加文字和贴纸并通过截屏保存。

有没有办法保存添加了动画 gif 的图像。

有人可以提出解决方案吗?

谢谢。

【问题讨论】:

  • 请具体说明您想要实现的目标以及您遇到的困难?你想在设备上保存 gif 吗?还是只是它的静态版本?
  • 是的,想在设备上保存 gif。不是静态的。
  • @Caleb 嗨,它仍然相关吗?如果是这样 - 请您指定,您是想仅在您的应用内使用创建的动画,还是要将其保存到照片库?

标签: ios swift uiimage gif


【解决方案1】:

您好,我使用以下方法实现了这一点,希望对某人有所帮助

1.在Image上放置gif后,我正在通过这种方法对holderView进行截图,使用计时器。

@objc func gifScreenShot() {
      guard let imageView = self.screenView else {
         return
      }

      UIGraphicsBeginImageContextWithOptions(imageView.frame.size, true, 0.0)
      imageView.drawHierarchy(in: imageView.bounds, afterScreenUpdates: true)
      let image = UIGraphicsGetImageFromCurrentImageContext()
      UIGraphicsEndImageContext()
      self.gifImages.append(image!)

      if gifImages.count == 50 {
         self.stopTimer()
      }
   }

2.截图50张后,我停止计时

   func stopTimer() {
      if gifTimer != nil {
         gifTimer!.invalidate()
         gifTimer = nil
         DispatchQueue.global(qos: .background).async {
            DispatchQueue.main.async {
               self.createVideo()
            }
         }
      }
   }

3.将所有截图合并为0.05秒视频并保存照片库

   func createVideo()  {
      let settings = CXEImagesToVideo.videoSettings(codec: AVVideoCodecType.h264.rawValue, width: (gifImages[0].cgImage?.width)!, height: (gifImages[0].cgImage?.height)!)
      let movieMaker = CXEImagesToVideo(videoSettings: settings)
      movieMaker.createMovieFrom(images: gifImages){ (fileURL:URL) in
         if self.isSaveVideo {
            PHPhotoLibrary.shared().performChanges({
               PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: fileURL)
            }) { saved, error in
               self.loadingViewStop()
               self.gifImages.removeAll()
               if saved {
                  self.gifImages.removeAll()
                  DispatchQueue.main.async {
                     self.view.toastMessage("Video saved successfully".localized)
                  }
               } else {
                  print(error)
               }
            }
         } else {
            self.gifImages.removeAll()
            self.videoFileURL = fileURL
            self.nextTapped(snap: nil)
         }
      }
   }

效果和我预期的一样

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-08-30
  • 2018-06-19
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 2012-03-22
  • 1970-01-01
相关资源
最近更新 更多