Swift UIImage在剪切后旋转
我有一个类设置,允许用户从他们的库中添加图像,裁剪并保存 该代码设置为,如果检索到的图像是纵向的,则在裁剪之前会向所有图像显示纵向形状的边框以对齐,如果是横向的,则会显示景观边框 如果选择的图像是规则形状的图像,则所有图像都可以正常工作。但是,如果检索到的图像是纵向的,并且不是规则的比例(意味着更接近正方形,而实际上不是正方形),则图像在被裁剪后会旋转。系统似乎将其视为一幅风景画 这是一个收割前和收割后的示例。即使我放大并使图像覆盖整个屏幕,它也会旋转图像: <代码>导入基础 导入UIKit 类SelectImageViewController:UIViewController、UIImagePickerControllerDelegate、UINavigationControllerDelegate、UIScrollViewDelegate{ @IBVAR imageView:UIImageView! @IBOutlet弱var imageConstraintTop:NSLayoutConstraint! @IBOutlet弱var ImageConstraintTright:NSLayoutConstraint! @IBOutlet弱var imageConstraintLeft:NSLayoutConstraint! @IBOutlet弱var imageConstraintBottom:NSLayoutConstraint! var lastZoomScale:CGFloat=-1 var imageName:String=“” var userPhotoUUID=UUID().uuidString 让userDefault=UserDefaults.standard var userDatabase:userDatabase=userDatabase() 让picker=UIImagePickerController() @iBCROLLVIEW:UIScrollView{ 迪塞特{ scrollView.delegate=self scrollView.minimumZoomScale=1.0 scrollView.maximumZoomScale=5.0 } } @IBOutlet弱var比率选择器:UISegmentedControl! @IBVAR CROPERAVIEWL:CROPERAVIEWL! 变量:CGRect{ 得到{ 让因子=imageView.image!.size.width/view.frame.width 让比例=1/scrollView.zoomScale 让imageFrame=imageView.imageFrame() 设x=(scrollView.contentOffset.x+cropAreaViewL.frame.origin.x-imageFrame.origin.x)*比例系数* 设y=(scrollView.contentOffset.y+cropAreaViewL.frame.origin.y-imageFrame.origin.y)*比例系数* let width=cropAreaViewL.frame.size.width*比例系数 let height=cropAreaViewL.frame.size.height*比例系数 返回CGRect(x:x,y:y,宽度:宽度,高度:高度) } } @IBOUTLE var cropAreaViewP:cropAreaViewP! 变量cropAreaP:CGRect{ 得到{ 让因子=imageView.image!.size.height/view.frame.height 让比例=1/scrollView.zoomScale 让imageFrame=imageView.imageFrame() 设x=(scrollView.contentOffset.x+cropAreaViewP.frame.origin.x-imageFrame.origin.x)*比例系数* 设y=(scrollView.contentOffset.y+cropAreaViewP.frame.origin.y-imageFrame.origin.y)*比例系数* let width=cropAreaViewP.frame.size.width*比例系数 let height=cropAreaViewP.frame.size.height*比例系数 返回CGRect(x:x,y:y,宽度:宽度,高度:高度) } } fileprivate var speciePhotos:Array=[SpeciePhotoModel]() func随机数(范围:ClosedRange=30000…99998)->Int{ 设最小值=range.lowerBound 设max=range.upperBound 返回Int(arc4random_uniform(UInt32(1+max-min)))+min } 重写func viewDidLoad(){ super.viewDidLoad() navigationItem.rightBarButtonItem=UIBarButtonItem(标题:“+”,样式:。普通,目标:self,操作:#选择器(SelectImageViewController.add(:)) 设id=randomNumber() userDefault.set(id,forKey:“photoID”) self.cropAreaViewP.ishiden=true self.croparaviewl.ishiden=true self.cropAreaViewL.layer.borderColor=(UIColor.red).cgColor self.cropAreaViewL.layer.borderWidth=1.0 self.cropAreaViewP.layer.borderColor=(UIColor.red).cgColor self.cropAreaViewP.layer.borderWidth=1.0 self.add.layer.cornerRadius=6.0 self.ratioSelector.layer.cornerRadius=6.0 self.tabBar控制器?.tabBar.ishiden=true self.add.ishiden=true self.ratioSelector.ishiden=true updateZoom() } func updateConstraints(){ 如果让image=imageView.image{ 设imageWidth=image.size.width 让imageHeight=image.size.height 让viewWidth=scrollView.bounds.size.width 让viewHeight=scrollView.bounds.size.height //如果图像小于滚动视图,则居中显示 var hPadding=(viewWidth-scrollView.zoomScale*imageWidth)/2 如果hPadding<0{hPadding=0} var vPadding=(viewHeight-scrollView.zoomScale*imageHeight)/2 如果vPadding<0{vPadding=0} imageConstraintLeft.constant=hPadding ImageConstraintTright.constant=hPadding imageConstraintTop.constant=vPadding imageConstraintBottom.constant=vPadding view.layoutIfNeeded() } } fileprivate func updateZoom(){ 如果让image=imageView.image{ var minZoom=min(scrollView.bounds.size.width/image.size.width, scrollView.bounds.size.height/image.size.height) 如果最小缩放>1{minZoom=1} scrollView.minimumZoomScale=0.3*最小缩放 //如果缩放未更改,则强制scrollViewDidZoom启动 如果minZoom==lastZoomScale{minZoom+=0.000001} scrollView.zoomScale=minZoom lastZoomScale=最小缩放 } } @iAction func比率选择器(\发送方:AnyObject){ 开关比率选择器。selectedSegmentIndex { 案例0://景观 self.croperaviewp.ishiden=trSwift UIImage在剪切后旋转,swift,uiimage,uipickerview,Swift,Uiimage,Uipickerview,我有一个类设置,允许用户从他们的库中添加图像,裁剪并保存 该代码设置为,如果检索到的图像是纵向的,则在裁剪之前会向所有图像显示纵向形状的边框以对齐,如果是横向的,则会显示景观边框 如果选择的图像是规则形状的图像,则所有图像都可以正常工作。但是,如果检索到的图像是纵向的,并且不是规则的比例(意味着更接近正方形,而实际上不是正方形),则图像在被裁剪后会旋转。系统似乎将其视为一幅风景画 这是一个收割前和收割后的示例。即使我放大并使图像覆盖整个屏幕,它也会旋转图像: 导入基础 导入UIKit 类Se
import Foundation
import UIKit
class SelectImageViewController: UIViewController, UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIScrollViewDelegate{
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var imageConstraintTop: NSLayoutConstraint!
@IBOutlet weak var imageConstraintRight: NSLayoutConstraint!
@IBOutlet weak var imageConstraintLeft: NSLayoutConstraint!
@IBOutlet weak var imageConstraintBottom: NSLayoutConstraint!
var lastZoomScale: CGFloat = -1
var imageName: String = ""
var userPhotoUUID = UUID().uuidString
let userDefault = UserDefaults.standard
var userDatabase: UserDatabase = UserDatabase()
let picker = UIImagePickerController()
@IBOutlet var scrollView: UIScrollView!{
didSet{
scrollView.delegate = self
scrollView.minimumZoomScale = 1.0
scrollView.maximumZoomScale = 5.0
}
}
@IBOutlet weak var ratioSelector: UISegmentedControl!
@IBOutlet var cropAreaViewL: CropAreaViewL!
var cropAreaL:CGRect{
get{
let factor = imageView.image!.size.width/view.frame.width
let scale = 1/scrollView.zoomScale
let imageFrame = imageView.imageFrame()
let x = (scrollView.contentOffset.x + cropAreaViewL.frame.origin.x - imageFrame.origin.x) * scale * factor
let y = (scrollView.contentOffset.y + cropAreaViewL.frame.origin.y - imageFrame.origin.y) * scale * factor
let width = cropAreaViewL.frame.size.width * scale * factor
let height = cropAreaViewL.frame.size.height * scale * factor
return CGRect(x: x, y: y, width: width, height: height)
}
}
@IBOutlet var cropAreaViewP: CropAreaViewP!
var cropAreaP:CGRect{
get{
let factor = imageView.image!.size.height/view.frame.height
let scale = 1/scrollView.zoomScale
let imageFrame = imageView.imageFrame()
let x = (scrollView.contentOffset.x + cropAreaViewP.frame.origin.x - imageFrame.origin.x) * scale * factor
let y = (scrollView.contentOffset.y + cropAreaViewP.frame.origin.y - imageFrame.origin.y) * scale * factor
let width = cropAreaViewP.frame.size.width * scale * factor
let height = cropAreaViewP.frame.size.height * scale * factor
return CGRect(x: x, y: y, width: width, height: height)
}
}
fileprivate var speciePhotos: Array<SpeciePhotoModel> = [SpeciePhotoModel]()
func randomNumber(range: ClosedRange<Int> = 30000...99998) -> Int {
let min = range.lowerBound
let max = range.upperBound
return Int(arc4random_uniform(UInt32(1 + max - min))) + min
}
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "+", style: .plain, target: self, action: #selector(SelectImageViewController.add(_:)))
let id = randomNumber()
userDefault.set(id, forKey: "photoID")
self.cropAreaViewP.isHidden = true
self.cropAreaViewL.isHidden = true
self.cropAreaViewL.layer.borderColor = (UIColor.red).cgColor
self.cropAreaViewL.layer.borderWidth = 1.0
self.cropAreaViewP.layer.borderColor = (UIColor.red).cgColor
self.cropAreaViewP.layer.borderWidth = 1.0
self.add.layer.cornerRadius = 6.0
self.ratioSelector.layer.cornerRadius = 6.0
self.tabBarController?.tabBar.isHidden = true
self.add.isHidden = true
self.ratioSelector.isHidden = true
updateZoom()
}
func updateConstraints() {
if let image = imageView.image {
let imageWidth = image.size.width
let imageHeight = image.size.height
let viewWidth = scrollView.bounds.size.width
let viewHeight = scrollView.bounds.size.height
// center image if it is smaller than the scroll view
var hPadding = (viewWidth - scrollView.zoomScale * imageWidth) / 2
if hPadding < 0 { hPadding = 0 }
var vPadding = (viewHeight - scrollView.zoomScale * imageHeight) / 2
if vPadding < 0 { vPadding = 0 }
imageConstraintLeft.constant = hPadding
imageConstraintRight.constant = hPadding
imageConstraintTop.constant = vPadding
imageConstraintBottom.constant = vPadding
view.layoutIfNeeded()
}
}
fileprivate func updateZoom() {
if let image = imageView.image {
var minZoom = min(scrollView.bounds.size.width / image.size.width,
scrollView.bounds.size.height / image.size.height)
if minZoom > 1 { minZoom = 1 }
scrollView.minimumZoomScale = 0.3 * minZoom
// Force scrollViewDidZoom fire if zoom did not change
if minZoom == lastZoomScale { minZoom += 0.000001 }
scrollView.zoomScale = minZoom
lastZoomScale = minZoom
}
}
@IBAction func ratioSelector(_ sender: AnyObject) {
switch ratioSelector.selectedSegmentIndex
{
case 0:// Landscape
self.cropAreaViewP.isHidden = true
self.cropAreaViewL.isHidden = false
case 1: // Portrait
self.cropAreaViewL.isHidden = true
self.cropAreaViewP.isHidden = false
default:
break;
}
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
dismiss(animated: true, completion: nil)
}
@IBOutlet weak var add : UIButton!
@IBAction func add(_ sender: UIButton) {
imageView.image = nil
let picker = UIImagePickerController()
picker.delegate = self
picker.sourceType = .photoLibrary
picker.allowsEditing = false
self.present(picker, animated: true, completion: nil)
self.ratioSelector.isHidden = false
self.add.isHidden = false
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Crop", style: .plain, target: self, action: #selector(SelectImageViewController.crop(_:)))
}
@IBAction func change(_ sender: UIButton) {
imageView.image = nil
let picker = UIImagePickerController()
picker.delegate = self
picker.sourceType = .photoLibrary
picker.allowsEditing = false
self.present(picker, animated: true, completion: nil)
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Crop", style: .plain, target: self, action: #selector(SelectImageViewController.crop(_:)))
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
if chosenImage.size.height > chosenImage.size.width
{
self.cropAreaViewL.isHidden = true
self.cropAreaViewP.isHidden = false
self.ratioSelector.selectedSegmentIndex = 1
imageView.image = chosenImage
}
else
{
self.cropAreaViewP.isHidden = true
self.cropAreaViewL.isHidden = false
self.ratioSelector.selectedSegmentIndex = 0
imageView.image = chosenImage
}
self.dismiss(animated: true, completion: nil)
}
@IBAction func crop(_ sender: UIButton) {
if cropAreaViewP.isHidden == true {
self.cropAreaViewL.layer.borderColor = (UIColor.clear).cgColor
let croppedCGImage = imageView.image?.cgImage?.cropping(to: cropAreaL)
let croppedImage = UIImage(cgImage: croppedCGImage!)
imageView.image = croppedImage
scrollView.zoomScale = 1
} else {
self.cropAreaViewP.layer.borderColor = (UIColor.clear).cgColor
let croppedCGImage = imageView.image?.cgImage?.cropping(to: cropAreaP)
let croppedImage = UIImage(cgImage: croppedCGImage!)
imageView.image = croppedImage
scrollView.zoomScale = 1
}
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Next", style: .plain, target: self, action: #selector(SelectImageViewController.saveButtonAction(_:)))
}
}
extension UIImageView{
func imageFrame()->CGRect{
let imageViewSize = self.frame.size
guard let imageSize = self.image?.size else{return CGRect.zero}
let imageRatio = imageSize.width / imageSize.height
let imageViewRatio = imageViewSize.width / imageViewSize.height
if imageRatio < imageViewRatio { // Portrait
let scaleFactor = imageViewSize.height / imageSize.height
let width = imageSize.width * scaleFactor
let topLeftX = (imageViewSize.width - width) * 0.5
return CGRect(x: topLeftX, y: 0, width: width, height: imageViewSize.height)
}else{ // Landscape
let scaleFactor = imageViewSize.width / imageSize.width
let height = imageSize.height * scaleFactor
let topLeftY = (imageViewSize.height - height) * 0.5
return CGRect(x: 0, y: topLeftY, width: imageViewSize.width, height: height)
}
}
}
class CropAreaViewL: UIView {
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
return false
}
}
class CropAreaViewP: UIView {
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
return false
}
}
let vPadding = max((viewHeight - scrollView.zoomScale * imageHeight) / 2, 0)
extension UIImage {
var isPortrait: Bool { return size.height > size.width }
var isLandscape: Bool { return size.width > size.height }
var breadth: CGFloat { return min(size.width, size.height) }
var breadthSize: CGSize { return CGSize(width: breadth, height: breadth) }
var squared: UIImage? {
guard let cgImage = cgImage?.cropping(to:
CGRect(origin: CGPoint(x: isLandscape ? floor((size.width-size.height)/2) : 0, y: isPortrait ? floor((size.height-size.width)/2) : 0),
size: breadthSize)) else { return nil }
return UIImage(cgImage: cgImage)
}
}
let profilePicture = UIImage(data: try! Data(contentsOf: URL(string:"https://i.stack.imgur.com/Xs4RX.jpg")!))!
if let squared = profilePicture.squared {
squared
}