我从后端接收的图像尺寸很大,因为我必须将相同的图像放在个人资料图片上,并在尺寸为30x30的标签栏的底栏上显示相同的图像。我试图以各种方式缩小图像,但没有任何工作。
尝试了Alamofire的方法,该方法也没有奏效(图像看起来模糊不清):
func resizeImageWithoutDistortion(image: UIImage, size : CGSize) -> UIImage{
// 1. Scale image to size disregarding aspect ratio
let scaledImage = image.af_imageScaled(to: size)
// 2. Scale image to fit within specified size while maintaining aspect ratio
let aspectScaledToFitImage = image.af_imageAspectScaled(toFit: size)
// 3. Scale image to fill specified size while maintaining aspect ratio
let aspectScaledToFillImage = image.af_imageAspectScaled(toFill: size)
return scaledImage.roundImage()
}
也尝试如下,但也没有奏效:
func resizeImage(_ newWidth: CGFloat) -> UIImage {
let ratio = size.width / size.height
if ratio > 1 {
UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newWidth))
draw(in: CGRect(x: newWidth * ratio / 2 - newWidth, y: 0, width: newWidth * ratio, height: newWidth))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!.roundImage()
} else {
UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newWidth))
draw(in: CGRect(x: 0, y: (newWidth / ratio - newWidth) / 2 * (-1), width: newWidth, height: newWidth / ratio))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!.roundImage()
}
}
答案 0 :(得分:0)
点数和像素不相同。
如果你在W: 30
H: 30
(点)中有一个UIImageView来计算你的图像(以像素为单位),以便在不影响质量的情况下清晰地显示它,你需要有一个图像像素大小 of:
30 * UIScreen.main.scale
= 60像素(如果是2倍比例)
或
30 * UIScreen.main.scale
= 90像素(如果是3倍)
这也是为什么你需要为iOS提供@ 2x和@ 3x缩放图像的原因。
因此,如果您想将UIImage
调整为较小的尺寸,则需要考虑缩放比例。否则,我们会缩放您的图片以填写UIImageView
,因为UIImageView
大于UIImage
尺寸,它们会变得模糊。
看到这个的一个好方法是,如果你设置yourImageView.contentMode = .Center
,你会注意到UIImage比UIImageView本身小。
我不在Swift中编码,因此我无法为您提供直接代码(厌倦翻译),但如果您查看其他主题:
scale image to smaller size in swift3
您看到UIGraphicsBeginImageContext错过了比例输入。
比例
要应用于位图的比例因子。如果指定值 如果为0.0,则比例因子设置为设备的比例因子 主屏幕。
编辑: 在你的情况下,像这样:
newWidth = newWidth / UIScreen.main.scale
UIGraphicsBeginImageContextWithOptions(CGSize(width: newWidth, height: newWidth), true, 0)