From 46e5cc113d45328de32b3655c8410321fd52ce6a Mon Sep 17 00:00:00 2001 From: Mustafa Merza <mustafa.merza95@gmail.com> Date: Sun, 18 Aug 2024 20:55:59 +0300 Subject: [PATCH] - Added signing pages without taking cells' screenshots: * signature position still needs fixing when the image is scaled inside image view * screenshots lose the image resolution and scale therefor different approach is taken. - Fixed sign size scale. - Fixed signing pages that are not displayed or loaded in the pager view. --- .../EditViewController.swift | 142 ++++++++++++++---- .../MultiPageScanSession.swift | 8 + 2 files changed, 117 insertions(+), 33 deletions(-) diff --git a/MiniScanner/Modules/EditViewController/EditViewController.swift b/MiniScanner/Modules/EditViewController/EditViewController.swift index f01309d..32705ea 100644 --- a/MiniScanner/Modules/EditViewController/EditViewController.swift +++ b/MiniScanner/Modules/EditViewController/EditViewController.swift @@ -483,39 +483,71 @@ extension EditViewController { let items = scanSession.scannedItems - if !banner.signAllDoc { - - let cell = banner.pagerView.cellForItemat(index: self.banner.pagerView.currentIndex) - - cell?.prepareCellForScreenshot() - - let image = cell?.contentView.TakeScreenshot() - - cell?.restoreCellAfterScreenshot() - - cell?.selectedStickerView1?.removeFromSuperview() - - if let image { + activityIndicator.startAnimating() + + Task { + if !banner.signAllDoc { - let index = banner.pagerView.currentIndex + let selectedIndex = banner.pagerView.currentIndex - replacePageImage(image: image, at: index) + await applySignatureToScannedItem(at: selectedIndex) - banner.pagerView.reloadData(at: index) + await MainActor.run { + banner.pagerView.reloadData(at: selectedIndex) + } + } else { + + for (index, _) in items.enumerated() { + + await applySignatureToScannedItem(at: index) + } + + await MainActor.run { + banner.pagerView.reloadData() + } } - } else { - for (index, item) in items.enumerated() { + await MainActor.run { + activityIndicator.stopAnimating() + } + } + } + + private func applySignatureToScannedItem(at index: Int) async { + + let cell = await MainActor.run { + banner.pagerView.cellForItemat(index: banner.pagerView.currentIndex) + } + + let scannedItem = await MainActor.run { + scanSession.scannedItems[index] + } + + var signedImage: UIImage? + + if let image = scannedItem.newRenderedImage?.retrieveImage(), + let signature = scannedItem.signtureImage, + let signaturePoint = scannedItem.signaturePosition, + let signatureSize = scannedItem.size { + + let originPoint = CGPoint(x: signaturePoint.x - signatureSize.width / 2, y: signaturePoint.y - signatureSize.height / 2) + + let signatureViewRect = CGRect(origin: originPoint, size: signatureSize) + + if let imageViewRect = cell?.imageView?.frame { + + signedImage = await getSignedImage(image: image, + imageViewRect: imageViewRect, + signature: signature, + signatureViewRect: signatureViewRect) - let image = item.screenShot + scannedItem.removeSign() - if let image { + if let signedImage { - replacePageImage(image: image, at: index) + replacePageImage(image: signedImage, at: index) } } - - banner.pagerView.reloadData() } } } @@ -591,11 +623,7 @@ extension EditViewController { let items = scanSession.scannedItems for item in items { - item.signtureImage = UIImage() - item.rotate = 0 - item.signaturePosition = .zero - item.screenShot = UIImage() - item.size = .zero + item.removeSign() } } @@ -754,11 +782,13 @@ extension EditViewController { private func addSignatureToAllPages(signatureImage: UIImage) { + let index = banner.pagerView.currentIndex + let items = scanSession.scannedItems - for (index, _) in items.enumerated() { + if let initPosition = banner.pagerView.cellForItem(at: index)?.contentView.center { - if let initPosition = banner.pagerView.cellForItem(at: 0)?.contentView.center { + for (index, _) in items.enumerated() { addSignatureToPage(signatureImage: signatureImage, at: index, position: initPosition) } @@ -767,7 +797,11 @@ extension EditViewController { private func addSignatureToPage(signatureImage: UIImage, at index: Int, position: CGPoint) { - scanSession.scannedItems[index].addSign(signature: signatureImage, position: position, size: CGSize(width: 125, height: 125), rotate: 0) + let scale = 125 / signatureImage.width + let newHeight = signatureImage.height * scale + let size = CGSize(width: 125, height: newHeight) + + scanSession.scannedItems[index].addSign(signature: signatureImage, position: position, size: size, rotate: 0) } private func replacePageImage(image: UIImage, at index: Int) { @@ -844,8 +878,6 @@ extension EditViewController: BannerViewDelegate { let signaturesCount = scanSession.scannedItems.filter { $0.signtureImage != nil && $0.signtureImage != UIImage() }.count - print("Heha", signaturesCount) - if signaturesCount == 0 { screenMode = .normal } @@ -1095,3 +1127,47 @@ extension EditViewController { } } } + +extension EditViewController { + + func getSignedImage(image: UIImage, + imageViewRect: CGRect, + signature: UIImage, + signatureViewRect: CGRect) async -> UIImage? { + + var signedImage: UIImage? + + let imageRect = CGRect(x: 0, y: 0, width: image.width, height: image.height) + + let scaledImageRect = AVMakeRect(aspectRatio: image.size, + insideRect: imageViewRect) + + let widthScale: CGFloat = imageRect.width / scaledImageRect.width + let heightScale: CGFloat = imageRect.height / scaledImageRect.height + + let newWidth = widthScale * signatureViewRect.width + let newHeight = heightScale * signatureViewRect.height + + let xScale: CGFloat = image.width / imageViewRect.width + let yScale: CGFloat = image.height / imageViewRect.height + + let newX = xScale * signatureViewRect.minX + let newY = yScale * signatureViewRect.minY + + let newSignatureRect = CGRect(x: newX, y: newY, width: newWidth, height: newHeight) + + let format = UIGraphicsImageRendererFormat() + format.scale = 1 + + let renderer = UIGraphicsImageRenderer(size: imageRect.size) + + signedImage = renderer.image { context in + + image.draw(in: imageRect) + + signatureImage.draw(in: newSignatureRect) + } + + return signedImage + } +} diff --git a/MiniScanner/Supporting Files/Frameworks/CustomWeScan/MultiPageSession/MultiPageScanSession.swift b/MiniScanner/Supporting Files/Frameworks/CustomWeScan/MultiPageSession/MultiPageScanSession.swift index 318bc3b..4f87409 100644 --- a/MiniScanner/Supporting Files/Frameworks/CustomWeScan/MultiPageSession/MultiPageScanSession.swift +++ b/MiniScanner/Supporting Files/Frameworks/CustomWeScan/MultiPageSession/MultiPageScanSession.swift @@ -97,6 +97,14 @@ public class ScannedItem: Codable, Identifiable { self.screenShot = self.newRenderedImage?.retrieveImage() } + public func removeSign() { + self.signtureImage = nil + self.signaturePosition = nil + self.size = nil + self.rotate = nil + self.screenShot = nil + } + public func addScreenShot(screen: UIImage) { self.screenShot = screen } -- GitLab