【问题标题】:AVMakeRectWithAspectRatioInsideRect returning correct image but wrong sizeAVMakeRectWithAspectRatioInsideRect 返回正确的图像但大小错误
【发布时间】:2015-03-20 19:35:10
【问题描述】:

我是 iOS Swift 开发的新手,但对图像处理更陌生。我在 UIScrollView 中有一个 UIImageView。我希望用户缩放/平移以显示他们想要捕获的确切图像。我有这个工作在一定程度上。当用户单击一个按钮时,它确实正确捕获了图像以及 UIScrollView 框中的内容,但是,图像的大小不正确。任何帮助将不胜感激!

@IBAction func tapSendtoBand(sender: UIButton) {


    var frameInfo = frameForImage(photoImageView.image!, imageView: photoImageView)
    var imageWidth = photoImageView.image!.size.height
    var scale:CGFloat = CGFloat(1.0) / (photoImageView.frame.size.height / imageWidth)


    var visibleRect = CGRect()
    var pWidth  = CGFloat(CGImageGetWidth(photoImageView.image?.CGImage))
    var pHeight = CGFloat(CGImageGetHeight(photoImageView.image?.CGImage))


    visibleRect.origin = scrollView.contentOffset
    visibleRect.size = scrollView.bounds.size
    visibleRect.origin.x *= scale
    visibleRect.origin.y *= scale
    visibleRect.size.width *= scale
    visibleRect.size.height *= scale

    var pSize:CGSize = CGSize(width: visibleRect.size.width,height: visibleRect.size.height)


    let bRect = AVMakeRectWithAspectRatioInsideRect(pSize, visibleRect)

    UIImageWriteToSavedPhotosAlbum(cropImage(photoImageView.image!, rect: bRect), nil, nil, nil)

    photoTest.image = cropImage(photoImageView.image!, rect: bRect)

}

这是我用来确定尺寸的框架函数

func frameForImage (image:UIImage, imageView:UIImageView) -> CGRect{

        var imageRatio = image.size.width / image.size.height;
        var viewRatio = imageView.frame.size.width / imageView.frame.size.height;

        if(imageRatio < viewRatio){

            var scale = imageView.frame.size.height / image.size.height;

            var width = scale * image.size.width;

            var topLeftX = (imageView.frame.size.width - width) * 0.5;
            return CGRectMake(topLeftX, 0, width, imageView.frame.size.height)
        }
        else{
            var scale = imageView.frame.size.width / image.size.width;
            var height = scale * image.size.height;
            var topLeftY = (imageView.frame.size.height - height) * 0.5;

            return CGRectMake(0, topLeftY, imageView.frame.size.width, height);
        }
    }

这是我用来实际裁剪图像的函数

func cropImage(srcImage:UIImage,rect:CGRect) -> UIImage
{
    var cgImageConv = srcImage.CGImage
    var cgSizeConv:CGSize = CGSize(width: 310,height: 102)
    var cr:CGImageRef = CGImageCreateWithImageInRect(cgImageConv, rect)
    var cropped:UIImage = UIImage(CGImage: cr)!

    return cropped
}

【问题讨论】:

  • 怎么了?那么拍摄的图像实际上是原始图像的正确部分但分辨率错误?长宽比对还是错?图片大小只有两倍还是一半?

标签: ios iphone swift uiscrollview uiimageview


【解决方案1】:

下面的代码将图像视图的模式设置为纵横比并填充屏幕区域。

//Makes your image view fill the real estate you have available on your phones screen
yourUIImageView.autoresizingMask = UIViewAutoresizing.FlexibleBottomMargin | UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleRightMargin | UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.FlexibleTopMargin | UIViewAutoresizing.FlexibleWidth

\

//Will make your image view Aspect ratio
yourUIImageView.contentMode = UIViewContentMode.ScaleAspectFit

【讨论】:

    【解决方案2】:

    我实际上发现了问题所在。这是我的方法。使用我想要捕获的可见区域的代码,我能够使用以下代码以正确的比例获得我想要的确切大小。

    var cr = CGImageCreateWithImageInRect(cgImageConv, visibleRect)
            var cfUIImage = UIImage(CGImage: cr)
    
            UIGraphicsBeginImageContext(CGSize(width: 620, height: 204))
                var context = UIGraphicsGetCurrentContext();
                CGContextTranslateCTM(context, 0.0, 102);
                CGContextScaleCTM(context, 1.0, -1.0);
                CGContextDrawImage(context, CGRectMake(CGFloat(0.0), CGFloat(0.0), 310, 102), cr);
                var scaledImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext();
    
    
            photoTest.image = scaledImage
            UIImageWriteToSavedPhotosAlbum(scaledImage, nil, nil, nil)
    

    【讨论】:

      【解决方案3】:

      关于前一篇文章的 Swift 3 解决方案:

      func frameForImageInImageViewAspectFit(imageView : UIImageView) -> CGRect {
          let img = imageView.image
          let frame = imageView.frame
      
          let imageRatio = (img?.size.width)! / (img?.size.height)!;
          let viewRatio = frame.size.width / frame.size.height;
      
          if (imageRatio < viewRatio) {
              let scale = frame.size.height / (img?.size.height)!;
      
              let width = scale * (img?.size.width)!;
      
              let topLeftX = (frame.size.width - width) * 0.5;
      
              return CGRect(x: topLeftX, y: 0, width: width, height: frame.size.height)
          }
          else {
              let scale = frame.size.width / (img?.size.width)!;
      
              let height = scale * (img?.size.height)!;
      
              let topLeftY = (frame.size.height - height) * 0.5;
      
              return CGRect(x: 0, y: topLeftY, width: frame.size.width, height: height)
          }
      }
      

      但更好的解决方案是 (Swift 3):

      self.imageView.frame = AVMakeRect(aspectRatio: (self.imageView.image?.size)!, insideRect: self.imageView.frame)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-22
        • 2015-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多