将 UIImage 调整为 200x200pt/px
Resize UIImage to 200x200pt/px
我一直在努力调整图像的大小。
基本上我偶然发现:
How to scale down a UIImage and make it crispy / sharp at the same time instead of blurry?
这似乎是一个合法的解决方案,但不知何故它无法正常工作。
我的应用程序适用于相机胶卷中的照片。此照片应调整为 200x200 左右,而宽度而非高度很重要。
不幸的是,我没有示例代码,因为我对无效解决方案的愤怒而丢弃了它,抱歉。
这是我的代码。图片的宽度为 850 像素而不是 200 像素:
func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage {
let scale = newWidth / image.size.width
let newHeight = image.size.height * scale
UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight))
image.drawInRect(CGRectMake(0, 0, newWidth, newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
@IBAction func chooseImage(sender: AnyObject) {
var myPickerController = UIImagePickerController()
myPickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
myPickerController.delegate = self;
self.presentViewController(myPickerController, animated: true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject])
{
var imagenow = info[UIImagePickerControllerOriginalImage] as? UIImage
imageImage.image = resizeImage(imagenow!, newWidth: 200)
pimg2 = imageImage.image!
cidnew2 = textFieldCID!.text!
pname2 = textFieldName!.text
pmanu2 = textFieldMan!.text
pnick2 = textFieldNick!.text
podate2 = textFieldPODate!.text
pno2 = textFieldArtNo!.text
self.dismissViewControllerAnimated(true, completion: nil)
}
如果您处理的是包含透明胶片的 PNG 图像,则接受的答案函数实际上会将透明区域转换为黑色。
如果您希望缩放并保持透明胶片在原位,请尝试此功能:
SWIFT 4
extension UIImage {
func scaleImage(toSize newSize: CGSize) -> UIImage? {
var newImage: UIImage?
let newRect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height).integral
UIGraphicsBeginImageContextWithOptions(newSize, false, 0)
if let context = UIGraphicsGetCurrentContext(), let cgImage = self.cgImage {
context.interpolationQuality = .high
let flipVertical = CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: newSize.height)
context.concatenate(flipVertical)
context.draw(cgImage, in: newRect)
if let img = context.makeImage() {
newImage = UIImage(cgImage: img)
}
UIGraphicsEndImageContext()
}
return newImage
}
}
此函数将 return 图像 width 您指定:
func scaleImage(image: UIImage, maximumWidth: CGFloat) -> UIImage {
let rect: CGRect = CGRectMake(0, 0, image.size.width, image.size.height)
let cgImage: CGImageRef = CGImageCreateWithImageInRect(image.CGImage!, rect)!
return UIImage(CGImage: cgImage, scale: image.size.width / maximumWidth, orientation: image.imageOrientation)
}
Swift 3.0
func scaledImage(_ image: UIImage, maximumWidth: CGFloat) -> UIImage {
let rect: CGRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
let cgImage: CGImage = image.cgImage!.cropping(to: rect)!
return UIImage(cgImage: cgImage, scale: image.size.width / maximumWidth, orientation: image.imageOrientation)
}
func getScaledDimension(width: CGFloat, height: CGFloat,new_width: CGFloat, new_height: CGFloat)->CGPoint {
let widthAspect = (width / new_width)
let heightAspect = (height / new_height)
if widthAspect == 0 || heightAspect == 0 {
return CGPoint(x: width, y: height)
}
var width1 : CGFloat = 0
var height1 : CGFloat = 0
if widthAspect > heightAspect {
width1 = (width) / heightAspect
height1 = (height) / heightAspect
} else {
width1 = (width) / widthAspect
height1 = (height) / widthAspect
}
return CGPoint(x: width1, y: height1 )
}
func ResizeImage(image: UIImage, targetSize: CGSize) -> UIImage {
let rect = CGRectMake(0, 0, targetSize.width, targetSize.height)
UIGraphicsBeginImageContextWithOptions(targetSize, false, 1.0)
image.drawInRect(rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
let imagesize = getScaledDimension(image.size.width, height: image.size.height , new_width: Width, new_height: Hieght)
print("Image Size Scaled Dimension -> H:\(imagesize.x) W:\(imagesize.y)")
let newImage = ResizeImage(image, targetSize: CGSizeMake(imagesize.x,imagesize.y))
print("Resize Image Size -> H\(newImage.size.height) W\(newImage.size.width) ")
根据 swift_dan 的回答,更新 Swift 3
func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage? {
let scale = newWidth / image.size.width
let newHeight = image.size.height * scale
UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
For Swift 3.0
只需将此代码段添加为 UIImage
的扩展即可。但是,请记住,这不会将图像制作成正方形,但如果它是那种形式,结果将是正方形。
extension UIImage {
func resizeImage(newWidth: CGFloat) -> UIImage {
let scale = newWidth / self.size.width
let newHeight = self.size.height * scale
UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
self.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
} }
如果您在项目中使用 kingfisher 库加载图像并想调整它的大小,方法如下:
Xcode 8
Swift 3x
let imageUrl = URL(string: "your image url")
//Size refer to the size which you want to resize your original image
let size = CGSize(width: 60, height: 60)
let processImage = ResizingImageProcessor(targetSize: size, contentMode: .aspectFit)
cell.courseTitleImage.kf.setImage(with: imageUrl! , placeholder: UIImage(named: "placeholder"), options: [.transition(ImageTransition.fade(1)), .processor(processImage)], progressBlock: nil, completionHandler: nil)
或
调整本地图片大小:-
可以参考@Christoph R
的回答
将图像大小缩小 1024,您可以随时根据服务器容量进行转换
func resizeImage(image: UIImage) -> UIImage {
if image.size.height >= 1024 && image.size.width >= 1024 {
UIGraphicsBeginImageContext(CGSize(width:1024, height:1024))
image.draw(in: CGRect(x:0, y:0, width:1024, height:1024))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
else if image.size.height >= 1024 && image.size.width < 1024
{
UIGraphicsBeginImageContext(CGSize(width:image.size.width, height:1024))
image.draw(in: CGRect(x:0, y:0, width:image.size.width, height:1024))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
else if image.size.width >= 1024 && image.size.height < 1024
{
UIGraphicsBeginImageContext(CGSize(width:1024, height:image.size.height))
image.draw(in: CGRect(x:0, y:0, width:1024, height:image.size.height))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
else
{
return image
}
}
Swift 4.0 -
如果您要处理包含透明胶片的图像,则接受的答案函数实际上会将透明区域转换为黑色。
如果您希望缩放并保持透明胶片在原位,请尝试此功能:
func resizeImageWith(image: UIImage, newSize: CGSize) -> UIImage {
let horizontalRatio = newSize.width / image.size.width
let verticalRatio = newSize.height / image.size.height
let ratio = max(horizontalRatio, verticalRatio)
let newSize = CGSize(width: image.size.width * ratio, height: image.size.height * ratio)
var newImage: UIImage
if #available(iOS 10.0, *) {
let renderFormat = UIGraphicsImageRendererFormat.default()
renderFormat.opaque = false
let renderer = UIGraphicsImageRenderer(size: CGSize(width: newSize.width, height: newSize.height), format: renderFormat)
newImage = renderer.image {
(context) in
image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
}
} else {
UIGraphicsBeginImageContextWithOptions(CGSize(width: newSize.width, height: newSize.height), isOpaque, 0)
image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
newImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
}
return newImage
}
此代码使用 UIGraphicsImageRenderer 在 iOS 10 中引入:在我的测试中,它比使用 UIGraphicsBeginImageContext 的早期示例快 10-40%(Swift 4 / Xcode 9):
extension UIImage {
func renderResizedImage (newWidth: CGFloat) -> UIImage {
let scale = newWidth / self.size.width
let newHeight = self.size.height * scale
let newSize = CGSize(width: newWidth, height: newHeight)
let renderer = UIGraphicsImageRenderer(size: newSize)
let image = renderer.image { (context) in
self.draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: newSize))
}
return image
}
}
在 Swift 4.2 中使用最大尺寸进一步改进 @rommex 的答案:
private extension UIImage {
func scaled(to maxSize: CGFloat) -> UIImage? {
let aspectRatio: CGFloat = min(maxSize / size.width, maxSize / size.height)
let newSize = CGSize(width: size.width * aspectRatio, height: size.height * aspectRatio)
let renderer = UIGraphicsImageRenderer(size: newSize)
return renderer.image { context in
draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: newSize))
}
}
}
这是@Christoph R 为 Swift 3.0 发布的回答的延续。
此代码适用于 Swift 5.0.1.
static func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage {
let scale = newWidth / image.size.width
let newHeight = image.size.height * scale
UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
在呼叫者站点
TaskUtilties.resizeImage(image: rawImage!, newWidth: CGFloat(50))
这段代码在方形图像上效果很好,不会降低质量
extension UIImage {
func resize(targetSize: CGSize) -> UIImage {
return UIGraphicsImageRenderer(size:targetSize).image { _ in
self.draw(in: CGRect(origin: .zero, size: targetSize))
}
}
}
回答来自:
Resize Image without losing quality
我一直在努力调整图像的大小。 基本上我偶然发现: How to scale down a UIImage and make it crispy / sharp at the same time instead of blurry?
这似乎是一个合法的解决方案,但不知何故它无法正常工作。
我的应用程序适用于相机胶卷中的照片。此照片应调整为 200x200 左右,而宽度而非高度很重要。
不幸的是,我没有示例代码,因为我对无效解决方案的愤怒而丢弃了它,抱歉。
这是我的代码。图片的宽度为 850 像素而不是 200 像素:
func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage {
let scale = newWidth / image.size.width
let newHeight = image.size.height * scale
UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight))
image.drawInRect(CGRectMake(0, 0, newWidth, newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
@IBAction func chooseImage(sender: AnyObject) {
var myPickerController = UIImagePickerController()
myPickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
myPickerController.delegate = self;
self.presentViewController(myPickerController, animated: true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject])
{
var imagenow = info[UIImagePickerControllerOriginalImage] as? UIImage
imageImage.image = resizeImage(imagenow!, newWidth: 200)
pimg2 = imageImage.image!
cidnew2 = textFieldCID!.text!
pname2 = textFieldName!.text
pmanu2 = textFieldMan!.text
pnick2 = textFieldNick!.text
podate2 = textFieldPODate!.text
pno2 = textFieldArtNo!.text
self.dismissViewControllerAnimated(true, completion: nil)
}
如果您处理的是包含透明胶片的 PNG 图像,则接受的答案函数实际上会将透明区域转换为黑色。
如果您希望缩放并保持透明胶片在原位,请尝试此功能:
SWIFT 4
extension UIImage {
func scaleImage(toSize newSize: CGSize) -> UIImage? {
var newImage: UIImage?
let newRect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height).integral
UIGraphicsBeginImageContextWithOptions(newSize, false, 0)
if let context = UIGraphicsGetCurrentContext(), let cgImage = self.cgImage {
context.interpolationQuality = .high
let flipVertical = CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: newSize.height)
context.concatenate(flipVertical)
context.draw(cgImage, in: newRect)
if let img = context.makeImage() {
newImage = UIImage(cgImage: img)
}
UIGraphicsEndImageContext()
}
return newImage
}
}
此函数将 return 图像 width 您指定:
func scaleImage(image: UIImage, maximumWidth: CGFloat) -> UIImage {
let rect: CGRect = CGRectMake(0, 0, image.size.width, image.size.height)
let cgImage: CGImageRef = CGImageCreateWithImageInRect(image.CGImage!, rect)!
return UIImage(CGImage: cgImage, scale: image.size.width / maximumWidth, orientation: image.imageOrientation)
}
Swift 3.0
func scaledImage(_ image: UIImage, maximumWidth: CGFloat) -> UIImage {
let rect: CGRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
let cgImage: CGImage = image.cgImage!.cropping(to: rect)!
return UIImage(cgImage: cgImage, scale: image.size.width / maximumWidth, orientation: image.imageOrientation)
}
func getScaledDimension(width: CGFloat, height: CGFloat,new_width: CGFloat, new_height: CGFloat)->CGPoint {
let widthAspect = (width / new_width)
let heightAspect = (height / new_height)
if widthAspect == 0 || heightAspect == 0 {
return CGPoint(x: width, y: height)
}
var width1 : CGFloat = 0
var height1 : CGFloat = 0
if widthAspect > heightAspect {
width1 = (width) / heightAspect
height1 = (height) / heightAspect
} else {
width1 = (width) / widthAspect
height1 = (height) / widthAspect
}
return CGPoint(x: width1, y: height1 )
}
func ResizeImage(image: UIImage, targetSize: CGSize) -> UIImage {
let rect = CGRectMake(0, 0, targetSize.width, targetSize.height)
UIGraphicsBeginImageContextWithOptions(targetSize, false, 1.0)
image.drawInRect(rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
let imagesize = getScaledDimension(image.size.width, height: image.size.height , new_width: Width, new_height: Hieght)
print("Image Size Scaled Dimension -> H:\(imagesize.x) W:\(imagesize.y)")
let newImage = ResizeImage(image, targetSize: CGSizeMake(imagesize.x,imagesize.y))
print("Resize Image Size -> H\(newImage.size.height) W\(newImage.size.width) ")
根据 swift_dan 的回答,更新 Swift 3
func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage? {
let scale = newWidth / image.size.width
let newHeight = image.size.height * scale
UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
For Swift 3.0
只需将此代码段添加为 UIImage
的扩展即可。但是,请记住,这不会将图像制作成正方形,但如果它是那种形式,结果将是正方形。
extension UIImage {
func resizeImage(newWidth: CGFloat) -> UIImage {
let scale = newWidth / self.size.width
let newHeight = self.size.height * scale
UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
self.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
} }
如果您在项目中使用 kingfisher 库加载图像并想调整它的大小,方法如下:
let imageUrl = URL(string: "your image url")
//Size refer to the size which you want to resize your original image
let size = CGSize(width: 60, height: 60)
let processImage = ResizingImageProcessor(targetSize: size, contentMode: .aspectFit)
cell.courseTitleImage.kf.setImage(with: imageUrl! , placeholder: UIImage(named: "placeholder"), options: [.transition(ImageTransition.fade(1)), .processor(processImage)], progressBlock: nil, completionHandler: nil)
或
调整本地图片大小:- 可以参考@Christoph R
的回答将图像大小缩小 1024,您可以随时根据服务器容量进行转换
func resizeImage(image: UIImage) -> UIImage {
if image.size.height >= 1024 && image.size.width >= 1024 {
UIGraphicsBeginImageContext(CGSize(width:1024, height:1024))
image.draw(in: CGRect(x:0, y:0, width:1024, height:1024))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
else if image.size.height >= 1024 && image.size.width < 1024
{
UIGraphicsBeginImageContext(CGSize(width:image.size.width, height:1024))
image.draw(in: CGRect(x:0, y:0, width:image.size.width, height:1024))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
else if image.size.width >= 1024 && image.size.height < 1024
{
UIGraphicsBeginImageContext(CGSize(width:1024, height:image.size.height))
image.draw(in: CGRect(x:0, y:0, width:1024, height:image.size.height))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
else
{
return image
}
}
Swift 4.0 -
如果您要处理包含透明胶片的图像,则接受的答案函数实际上会将透明区域转换为黑色。
如果您希望缩放并保持透明胶片在原位,请尝试此功能:
func resizeImageWith(image: UIImage, newSize: CGSize) -> UIImage {
let horizontalRatio = newSize.width / image.size.width
let verticalRatio = newSize.height / image.size.height
let ratio = max(horizontalRatio, verticalRatio)
let newSize = CGSize(width: image.size.width * ratio, height: image.size.height * ratio)
var newImage: UIImage
if #available(iOS 10.0, *) {
let renderFormat = UIGraphicsImageRendererFormat.default()
renderFormat.opaque = false
let renderer = UIGraphicsImageRenderer(size: CGSize(width: newSize.width, height: newSize.height), format: renderFormat)
newImage = renderer.image {
(context) in
image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
}
} else {
UIGraphicsBeginImageContextWithOptions(CGSize(width: newSize.width, height: newSize.height), isOpaque, 0)
image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
newImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
}
return newImage
}
此代码使用 UIGraphicsImageRenderer 在 iOS 10 中引入:在我的测试中,它比使用 UIGraphicsBeginImageContext 的早期示例快 10-40%(Swift 4 / Xcode 9):
extension UIImage {
func renderResizedImage (newWidth: CGFloat) -> UIImage {
let scale = newWidth / self.size.width
let newHeight = self.size.height * scale
let newSize = CGSize(width: newWidth, height: newHeight)
let renderer = UIGraphicsImageRenderer(size: newSize)
let image = renderer.image { (context) in
self.draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: newSize))
}
return image
}
}
在 Swift 4.2 中使用最大尺寸进一步改进 @rommex 的答案:
private extension UIImage {
func scaled(to maxSize: CGFloat) -> UIImage? {
let aspectRatio: CGFloat = min(maxSize / size.width, maxSize / size.height)
let newSize = CGSize(width: size.width * aspectRatio, height: size.height * aspectRatio)
let renderer = UIGraphicsImageRenderer(size: newSize)
return renderer.image { context in
draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: newSize))
}
}
}
这是@Christoph R 为 Swift 3.0 发布的回答的延续。 此代码适用于 Swift 5.0.1.
static func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage {
let scale = newWidth / image.size.width
let newHeight = image.size.height * scale
UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
在呼叫者站点
TaskUtilties.resizeImage(image: rawImage!, newWidth: CGFloat(50))
这段代码在方形图像上效果很好,不会降低质量
extension UIImage {
func resize(targetSize: CGSize) -> UIImage {
return UIGraphicsImageRenderer(size:targetSize).image { _ in
self.draw(in: CGRect(origin: .zero, size: targetSize))
}
}
}
回答来自: Resize Image without losing quality