QRCodeViewModel.swift 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. //
  2. // QRCodeViewModel.swift
  3. // TUIRoomKit
  4. //
  5. // Created by janejntang on 2023/1/11.
  6. // Copyright © 2023 Tencent. All rights reserved.
  7. //
  8. import Foundation
  9. import PhotosUI
  10. class QRCodeViewModel {
  11. let urlString: String
  12. var store: RoomStore {
  13. EngineManager.shared.store
  14. }
  15. init(urlString: String) {
  16. self.urlString = urlString
  17. }
  18. func copyAction(sender: UIButton, text: String) {
  19. UIPasteboard.general.string = text
  20. }
  21. func saveIntoAlbumAction(sender: UIButton, image: UIImage) {
  22. UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
  23. }
  24. func backAction() {
  25. RoomRouter.shared.dismissPopupViewController()
  26. }
  27. func createQRCodeImageView(url: String, imageView: UIImageView) {
  28. if url.count == 0 { return }
  29. guard let filter = CIFilter(name: "CIQRCodeGenerator") else {return}
  30. filter.setDefaults()
  31. // Set filter input data
  32. let data = url.data(using: String.Encoding.utf8)
  33. filter.setValue(data, forKey: "inputMessage")
  34. // Set the error correction rate of QR code
  35. filter.setValue("M", forKey: "inputCorrectionLevel")
  36. guard var image = filter.outputImage else { return }
  37. let transform = CGAffineTransform(scaleX: 20, y: 20)
  38. image = image.transformed(by: transform)
  39. let resultImage = UIImage(ciImage: image)
  40. guard let center = UIImage(named: "AppIcon.png") else { return }
  41. guard let resultImage = getClearImage(sourceImage: resultImage, center: center) else { return }
  42. imageView.image = resultImage
  43. }
  44. private func getClearImage(sourceImage: UIImage, center: UIImage) -> UIImage? {
  45. let size = sourceImage.size
  46. UIGraphicsBeginImageContext(size)
  47. sourceImage.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
  48. let width: CGFloat = 80
  49. let height: CGFloat = 80
  50. let x: CGFloat = (size.width - width) * 0.5
  51. let y: CGFloat = (size.height - height) * 0.5
  52. center.draw(in: CGRect(x: x, y: y, width: width, height: height))
  53. guard let resultImage = UIGraphicsGetImageFromCurrentImageContext() else { return nil }
  54. UIGraphicsEndImageContext()
  55. return resultImage
  56. }
  57. deinit {
  58. debugPrint("deinit \(self)")
  59. }
  60. }