如何使用 af_imageAspectScaled 缩放到所需的像素大小

Posted

技术标签:

【中文标题】如何使用 af_imageAspectScaled 缩放到所需的像素大小【英文标题】:How to scale to desired size in pixels using af_imageAspectScaled 【发布时间】:2019-05-01 00:36:15 【问题描述】:

我正在使用 AlamoFireImage 在将用户个人资料图片发送到服务器之前对其进行裁剪。我们的服务器有一些限制,我们不能发送大于 640x640 的图像。

我正在使用 af_imageAspectScaled UIImage 扩展函数,如下所示:

let croppedImage = image.af_imageAspectScaled(
  toFill: CGSize(
    width: 320,
    height: 320
  )
)

我希望这会将 image 裁剪为 320 x 320 像素的图像。但是我发现输出图像被保存为比例为 2.0 的 640x640px 图像。以下 XCTest 显示了这一点:

class UIImageTests: XCTestCase 
  func testAfImageAspectScaled() 
    if let image = UIImage(
      named: "ipad_mini2_photo_1.JPG",
      in: Bundle(for: type(of: self)),
      compatibleWith: nil
    ) 
      print (image.scale) // prints 1.0
      print (image.size)  // prints (1280.0, 960.0)

      let croppedImage = image.af_imageAspectScaled(
        toFill: CGSize(
          width: 320,
          height: 320
        )
      )

      print (croppedImage.scale) // prints 2.0
      print (croppedImage.size)  // prints (320.0, 320.0)
      
  

我在 Xcode 10.2 的 iPhone Xr 模拟器上运行它。

原始图像为 1280 x 960 点,比例为 1,相当于 1280 x 960 像素。裁剪后的图像为 320 x 320 点,比例为 2,相当于 640 x 640 像素。

为什么比例设置为 2?我可以改变它吗?如何生成独立于比例和设备的 320 x 320 像素图像?

【问题讨论】:

【参考方案1】:

好吧,检查source code for the af_imageAspectScaled method我发现了以下代码用于生成实际的缩放图像:

UIGraphicsBeginImageContextWithOptions(size, af_isOpaque, 0.0)
draw(in: CGRect(origin: origin, size: scaledSize))
let scaledImage = UIGraphicsGetImageFromCurrentImageContext() ?? self
UIGraphicsEndImageContext()

UIGraphicsBeginImageContextWithOptions 上的值为 0.0 的参数告诉该方法使用主屏幕比例因子来定义图像大小。

我尝试将其设置为 1.0,并且在运行我的测试用例时,af_imageAspectScaled 生成了具有我想要的正确尺寸的图像。

Here 有一个表格显示了所有 ios 设备的分辨率。我的应用程序正在为比例因子为 2.0 的所有设备发送适当大小的图像,但是有几个设备的比例因子为 3.0。对于那些应用程序无法正常工作的人。

好吧,不幸的是,如果我想使用af_imageAspectScaled,我必须在设置缩放大小时将我想要的最终大小除以设备的比例,如下所示:

let scale = UIScreen.main.scale

let croppedImage = image.af_imageAspectScaled(
  toFill: CGSize(
    width: 320/scale,
    height: 320/scale
  )
)

I've sent a pull request to AlamofireImage 提议将参数scale 添加到函数af_imageAspectScaled(toFill:)af_imageAspectScaled(toFit:)af_imageScaled(to:)。如果他们接受它,上面的代码应该变成:

// this is not valid with Alamofire 4.0.0 yet! waiting for my pull request to
// be accepted
let croppedImage = image.af_imageAspectScaled(
  toFill: CGSize(
    width: 320,
    height: 320
  ),
  scale: 1.0
)
// croppedImage would be a 320px by 320px image, regardless of the device type.

【讨论】:

以上是关于如何使用 af_imageAspectScaled 缩放到所需的像素大小的主要内容,如果未能解决你的问题,请参考以下文章

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?