以编程方式从底部裁剪图像
Crop image from bottom programmatically
我正在开发自定义相机应用程序。事情进展顺利。
但是我在从底部裁剪图像时遇到了问题。即裁剪后的图像与原始图像具有完全相同的宽度,但高度将为原始图像的 1/3,并且必须从底部开始。
方法:
func croppIngimage(ImageCrop:UIImage, toRect rect:CGRect) -> UIImage{
var imageRef:CGImageRef = CGImageCreateWithImageInRect(imageToCrop.CGImage, rect)
var croppedimage:UIImage = UIImage(CGImage:imageRef)
return croppedimage
}
致电:
var ImageCrop:UIImage = UIImage(named:"image.png")
Swift3 解法:
func cropBottomImage(image: UIImage) -> UIImage {
let height = CGFloat(image.size.height / 3)
let rect = CGRect(x: 0, y: image.size.height - height, width: image.size.width, height: height)
return cropImage(image: image, toRect: rect)
}
使用矩形裁剪的辅助方法:
func cropImage(image:UIImage, toRect rect:CGRect) -> UIImage{
let imageRef:CGImage = image.cgImage!.cropping(to: rect)!
let croppedImage:UIImage = UIImage(cgImage:imageRef)
return croppedImage
}
这几乎就是 Alexburtnik 的回答
但只是提一下 UIImage.size 是合乎逻辑的大小(在 "points" 中)
但是,CGImage.cropping() 使用了实际尺寸(在 "pixels" 中)
因此,如果您使用带有@2x 或@3x 修饰符的图像,您会发现
裁剪实际上是预期的一半或三分之一。
所以裁剪的时候,可以考虑先将rect乘以图片的"scale" 属性,如下:
func cropImage(image:UIImage, toRect rect:CGRect) -> UIImage? {
var rect = rect
rect.size.width = rect.width * image.scale
rect.size.height = rect.height * image.scale
guard let imageRef = image.cgImage?.cropping(to: rect) else {
return nil
}
let croppedImage = UIImage(cgImage:imageRef)
return croppedImage
}
作为 UIImage 的扩展:
import UIKit
extension UIImage {
func crop(to rect: CGRect) -> UIImage? {
// Modify the rect based on the scale of the image
var rect = rect
rect.size.width = rect.size.width * self.scale
rect.size.height = rect.size.height * self.scale
// Crop the image
guard let imageRef = self.cgImage?.cropping(to: rect) else {
return nil
}
return UIImage(cgImage: imageRef)
}
}
用法:
let myImage = UIImage(named:"myImage.png")
let croppedRect = CGRect(x: 0, y: 0, width: newWidth, height: newHeight)
let croppedImage = myImage.crop(to: croppedRect)
我正在开发自定义相机应用程序。事情进展顺利。
但是我在从底部裁剪图像时遇到了问题。即裁剪后的图像与原始图像具有完全相同的宽度,但高度将为原始图像的 1/3,并且必须从底部开始。
方法:
func croppIngimage(ImageCrop:UIImage, toRect rect:CGRect) -> UIImage{
var imageRef:CGImageRef = CGImageCreateWithImageInRect(imageToCrop.CGImage, rect)
var croppedimage:UIImage = UIImage(CGImage:imageRef)
return croppedimage
}
致电:
var ImageCrop:UIImage = UIImage(named:"image.png")
Swift3 解法:
func cropBottomImage(image: UIImage) -> UIImage {
let height = CGFloat(image.size.height / 3)
let rect = CGRect(x: 0, y: image.size.height - height, width: image.size.width, height: height)
return cropImage(image: image, toRect: rect)
}
使用矩形裁剪的辅助方法:
func cropImage(image:UIImage, toRect rect:CGRect) -> UIImage{
let imageRef:CGImage = image.cgImage!.cropping(to: rect)!
let croppedImage:UIImage = UIImage(cgImage:imageRef)
return croppedImage
}
这几乎就是 Alexburtnik 的回答
但只是提一下 UIImage.size 是合乎逻辑的大小(在 "points" 中)
但是,CGImage.cropping() 使用了实际尺寸(在 "pixels" 中)
因此,如果您使用带有@2x 或@3x 修饰符的图像,您会发现 裁剪实际上是预期的一半或三分之一。
所以裁剪的时候,可以考虑先将rect乘以图片的"scale" 属性,如下:
func cropImage(image:UIImage, toRect rect:CGRect) -> UIImage? {
var rect = rect
rect.size.width = rect.width * image.scale
rect.size.height = rect.height * image.scale
guard let imageRef = image.cgImage?.cropping(to: rect) else {
return nil
}
let croppedImage = UIImage(cgImage:imageRef)
return croppedImage
}
作为 UIImage 的扩展:
import UIKit
extension UIImage {
func crop(to rect: CGRect) -> UIImage? {
// Modify the rect based on the scale of the image
var rect = rect
rect.size.width = rect.size.width * self.scale
rect.size.height = rect.size.height * self.scale
// Crop the image
guard let imageRef = self.cgImage?.cropping(to: rect) else {
return nil
}
return UIImage(cgImage: imageRef)
}
}
用法:
let myImage = UIImage(named:"myImage.png")
let croppedRect = CGRect(x: 0, y: 0, width: newWidth, height: newHeight)
let croppedImage = myImage.crop(to: croppedRect)