Ios UIImagePickerController从照片库中拾取劣质图像

Ios UIImagePickerController从照片库中拾取劣质图像,ios,swift,uiimagepickercontroller,Ios,Swift,Uiimagepickercontroller,在演示UIImagePickerController时,我在“UIImageView”上使用正常的点击手势。但我不知道为什么从照片库中挑选的图像总是质量不好(模糊、裁剪等)。当从相机中选取图像时,结果是非常精细的 以下是此自定义视图类的完整代码 class ImageEditingView: UIView { let imageView = UIImageView() weak var delegate: ViewController! var croppingRect: CGRect

在演示UIImagePickerController时,我在“UIImageView”上使用正常的点击手势。但我不知道为什么从照片库中挑选的图像总是质量不好(模糊、裁剪等)。当从相机中选取图像时,结果是非常精细的

以下是此自定义视图类的完整代码

class ImageEditingView: UIView {

let imageView = UIImageView()

weak var delegate: ViewController!

var croppingRect: CGRect?
var croppedRect: CGRect?

var ratioWidth: CGFloat? {
    didSet {
        self.setNeedsDisplay()
    }
}
var ratioHeight: CGFloat? {
    didSet {
        self.setNeedsDisplay()
    }
}

// Only override draw() if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func draw(_ rect: CGRect) {
    super.draw(rect)
    // Drawing code

    let padding: CGFloat = 20

    self.imageView.frame = CGRect(center: rect.midPoint, size: rect.size - padding)
    self.imageView.contentMode = .scaleAspectFill
    self.imageView.clipsToBounds = true
    self.imageView.isUserInteractionEnabled = true
    self.imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(openImagePickerConroller)))
    self.addSubview(imageView)



    if let imageWidth = ratioWidth, let imageHeight = ratioHeight {
        if imageWidth > imageHeight {
            let newImageHeight = imageHeight/imageWidth * (rect.size.width - (2 * padding))
            let yForCroppedRect = (self.bounds.size.height - newImageHeight)/2
            self.croppingRect = CGRect(x: padding, y: yForCroppedRect, width: rect.size.width - (2 * padding), height: newImageHeight)
        } else if imageWidth < imageHeight {
            let newImageWidth = imageWidth/imageHeight * (rect.size.height - (2 * padding))
            let xForCroppedRect = (self.bounds.size.width - newImageWidth)/2
            self.croppingRect = CGRect(x: xForCroppedRect, y: padding, width: newImageWidth, height: rect.size.height - (2 * padding))
        } else {
            self.croppingRect = nil
        }
    }

    let bigRect = CGRect(x: 0, y: 0, width: self.bounds.width, height: self.bounds.height)
    let smallRect = self.croppingRect ?? self.imageView.frame
    self.croppedRect = smallRect
    let pathBigRect = UIBezierPath(rect: bigRect)
    let pathSmallRect = UIBezierPath(rect: smallRect)

    pathBigRect.append(pathSmallRect)
    pathBigRect.usesEvenOddFillRule = true

    let fillLayer = CAShapeLayer()
    fillLayer.path = pathBigRect.cgPath
    fillLayer.fillRule = CAShapeLayerFillRule.evenOdd
    fillLayer.fillColor = UIColor.darkGray.cgColor
    //fillLayer.opacity = 0.4
    self.layer.addSublayer(fillLayer)
}

@objc func openImagePickerConroller() {
    let imagePicker = UIImagePickerController()
    imagePicker.sourceType = .photoLibrary//.camera
    imagePicker.delegate = self
    self.delegate.present(imagePicker, animated: true, completion: nil)
}

}

extension ImageEditingView: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    if let pickedImage = info[.originalImage] as? UIImage {
        self.imageView.image = pickedImage
        self.ratioWidth = 10
        self.ratioHeight = 10
        self.delegate.dismiss(animated: true, completion: nil)
    }
}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    self.delegate.dismiss(animated: true, completion: nil)
}

}

extension CGRect {
init(center: CGPoint, size: CGSize) {
    let origin = CGPoint(x: center.x - (size.width/2), y: center.y - (size.height/2))
    self.init(origin: origin, size: size)
}

var midPoint: CGPoint {
    return CGPoint(x: self.midX, y: self.midY)
}
}

extension CGSize {
static func -(size: CGSize, diff: CGFloat) -> CGSize {
    let dim = size.width <= size.height ? size.width : size.height
    return CGSize(width: dim - diff, height: dim - diff)
}
}
class ImageEditingView:UIView{
让imageView=UIImageView()
弱变量委托:ViewController!
变量cropingrect:CGRect?
var croppedRect:CGRect?
var比率宽度:CGFloat{
迪塞特{
self.setNeedsDisplay()
}
}
var比率权重:CGFloat{
迪塞特{
self.setNeedsDisplay()
}
}
//仅当执行自定义绘图时才重写绘图()。
//空实现会对动画期间的性能产生不利影响。
重写函数绘图(rect:CGRect){
超级绘图(矩形)
//绘图代码
让填充:CGFloat=20
self.imageView.frame=CGRect(中心:rect.middpoint,大小:rect.size-padding)
self.imageView.contentMode=.scaleAspectFill
self.imageView.clipstobunds=true
self.imageView.isUserInteractionEnabled=true
self.imageView.addgestureRecognitizer(UITapgestureRecognitizer(目标:self,操作:#选择器(openImagePickerConroller)))
self.addSubview(imageView)
如果让imageWidth=ratioWidth,则让imageHeight=ratioHeight{
如果imageWidth>imageHeight{
设newImageHeight=imageHeight/imageWidth*(rect.size.width-(2*填充))
设yForCroppedRect=(self.bounds.size.height-newImageHeight)/2
self.cropingrect=CGRect(x:padding,y:yForCroppedRect,width:rect.size.width-(2*padding),height:newImageHeight)
}否则,如果imageWidthCGSize{

let dim=size.width您是否有机会在iOS 13.0测试版上进行测试?请使用最新的iOS 13测试版再试一次,这将修复此错误。

您是从高分辨率照片库中选择的图像吗?请向我们展示您的代码。是的,它们是高分辨率图像。
ratioWidth
ratioHeight
所使用的比率是多少。另外如果你把它注释掉会发生什么?如果我把它们注释掉是没有帮助的。我在UIImage周围画了一个黑色的图层,正如你在上面的图片中看到的那样。这并没有真正的影响。但是如果你仍然想知道我在上面分享了完整的代码。