###前提・実現したいこと
iPhoneアプリ開発に関して、
・表示されている画像を走査して、加工をしたい。
・画像走査
###発生している問題・エラーメッセージ
PC上のシミュレーターでは処理が上手くいくのだが、実機を用いたテストで上手くいかない。
具体的には、ボタンクリックで該当の処理が走り、画像に表示されるはずだが、画像が更新されない。
ボタンもクリックされた状態から戻らない。
・概要
ボタンをクリック
↓
処理functionを呼び出し
↓
function内で画像を走査し、dataへ変換、さらに再生成して戻す
↓
呼び出し元にUIImage返す
↓
上記画像をセット
###該当のソースコード ※修正しました
----画像拡大---- import UIKit import Photos class FAScrollView: UIScrollView{ // MARK: Class properties var imageView:UIImageView = UIImageView() var imageToDisplay:UIImage? = nil{ didSet{ zoomScale = 1.0 minimumZoomScale = 1.0 imageView.image = imageToDisplay imageView.frame.size = sizeForImageToDisplay() imageView.center = center contentSize = imageView.frame.size contentInset = UIEdgeInsetsMake(0, 0, 0, 0) updateLayout() } } var gridView:UIView = Bundle.main.loadNibNamed("FAGridView", owner: nil, options: nil)?.first as! UIView // MARK : Class Functions override func awakeFromNib() { super.awakeFromNib() viewConfigurations() } func updateLayout() { imageView.center = center; var frame:CGRect = imageView.frame; if (frame.origin.x < 0) { frame.origin.x = 0 } if (frame.origin.y < 0) { frame.origin.y = 0 } imageView.frame = frame } func zoom() { if (zoomScale <= 1.0) { setZoomScale(zoomScaleWithNoWhiteSpaces(), animated: true) } else{ setZoomScale(minimumZoomScale, animated: true) } updateLayout() } ---画像拡大→画面遷移---- import UIKit import Photos class FAImageCropperVC: UIViewController { // MARK: IBOutlets @IBOutlet weak var scrollContainerView: UIView! @IBOutlet weak var scrollView: FAScrollView! @IBOutlet weak var collectionView: UICollectionView! @IBOutlet weak var btnZoom: UIButton! @IBOutlet weak var btnCrop: UIButton! @IBAction func zoom(_ sender: Any) { scrollView.zoom() } @IBAction func crop(_ sender: Any) { croppedImage = captureVisibleRect() performSegue(withIdentifier: "FADetailViewSegue", sender: nil) } // MARK: Public Properties var photos:[PHAsset]! // MARK: Private Properties private let imageLoader = FAImageLoader() private var croppedImage: UIImage? = nil // MARK: LifeCycle override func viewDidLoad() { super.viewDidLoad() viewConfigurations() // zoom,cropボタン checkForPhotosPermission() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "FADetailViewSegue" { let detailVC = segue.destination as? FADetailVC detailVC?.croppedImage = croppedImage } } // MARK: Private Functions private func checkForPhotosPermission(){ //※省略 } private func viewConfigurations() { btnCrop.layer.cornerRadius = btnCrop.frame.size.width/2 btnZoom.layer.cornerRadius = btnZoom.frame.size.width/2 } private func configureImageCropper(assets:[PHAsset]){ if assets.count != 0{ photos = assets collectionView.delegate = self collectionView.dataSource = self collectionView.reloadData() selectDefaultImage() } } private func selectDefaultImage(){ collectionView.selectItem(at: IndexPath(item: 0, section: 0), animated: true, scrollPosition: .top) selectImageFromAssetAtIndex(index: 0) } private func captureVisibleRect() -> UIImage{ var croprect = CGRect.zero let xOffset = (scrollView.imageToDisplay?.size.width)! / scrollView.contentSize.width; let yOffset = (scrollView.imageToDisplay?.size.height)! / scrollView.contentSize.height; croprect.origin.x = scrollView.contentOffset.x * xOffset; croprect.origin.y = scrollView.contentOffset.y * yOffset; let normalizedWidth = (scrollView?.frame.width)! / (scrollView?.contentSize.width)! let normalizedHeight = (scrollView?.frame.height)! / (scrollView?.contentSize.height)! croprect.size.width = scrollView.imageToDisplay!.size.width * normalizedWidth croprect.size.height = scrollView.imageToDisplay!.size.height * normalizedHeight let cr: CGImage? = scrollView.imageView.image?.cgImage?.cropping(to: croprect) let cropped = UIImage(cgImage: cr!) return cropped } private func isSquareImage() -> Bool{ let image = scrollView.imageToDisplay if image?.size.width == image?.size.height { return true } else { return false } } // MARK: Public Functions func selectImageFromAssetAtIndex(index:NSInteger){ FAImageLoader.imageFrom(asset: photos[index], size: PHImageManagerMaximumSize) { (image) in DispatchQueue.main.async { self.displayImageInScrollView(image: image) } } } func displayImageInScrollView(image:UIImage){ self.scrollView.imageToDisplay = image if isSquareImage() { btnZoom.isHidden = true } else { btnZoom.isHidden = false } } } ----呼び出し元------ private func viewConfigurations(){ imageView.image = croppedImage imageView.contentMode = UIViewContentMode.scaleAspectFit } @IBAction func editButton_Clicked(_ sender: Any) { //加工処理 let editedImage = TransparentImage().transparentImage(image: croppedImage) croppedImage = editedImage //画像セット viewConfigurations() } ----呼び出し先(TransparentImage)------ import UIKit import CoreImage class TransparentImage: NSObject { func transparentImage (image: UIImage) -> UIImage{ let editedimage:UIImage // let width :Int = Int((image.size.width)) let width :Int = Int((image.cgImage!.width)) // let height :Int = Int((image.size.height)) let height :Int = Int((image.cgImage!.height)) let imageData = image.cgImage!.dataProvider!.data //cgimageのデータ let datalenght = CFDataGetLength(imageData) var rawData = [UInt8](repeating: 0, count: datalenght) CFDataGetBytes(imageData,CFRange(location: 0, length: datalenght),&rawData) //画像データをrawDataへ転送 let provider = CGDataProvider(dataInfo: nil,data: rawData, size: datalenght,releaseData: releaseData) let colorSpaceRef = image.cgImage!.colorSpace let bitmapInfo = image.cgImage!.bitmapInfo let bitsPerComponent:Int = image.cgImage!.bitsPerComponent let bitsPerPixel = image.cgImage!.bitsPerPixel let bytesPerRow = image.cgImage!.bytesPerRow let cgImage = CGImage(width: width, height: height, bitsPerComponent: bitsPerComponent, bitsPerPixel: bitsPerPixel, bytesPerRow:bytesPerRow, space: colorSpaceRef!, bitmapInfo: bitmapInfo, provider: provider!, decode: nil, shouldInterpolate: false, intent: .defaultIntent) editedimage = UIImage(cgImage:cgImage!, scale:image.scale, orientation:image.imageOrientation) return editedimage } let releaseData: CGDataProviderReleaseDataCallback = { (info: UnsafeMutableRawPointer?, data: UnsafeRawPointer, size: Int) -> () in // https://developer.apple.com/reference/coregraphics/cgdataproviderreleasedatacallback // N.B. 'CGDataProviderRelease' is unavailable: Core Foundation objects are automatically memory managed print("callback") return } }
###補足情報(言語/FW/ツール等のバージョンなど)
swift3
テスト機:7 Plus
回答2件
あなたの回答
tips
プレビュー