如何使用 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 缩放到所需的像素大小的主要内容,如果未能解决你的问题,请参考以下文章
如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]