在Swift编程中,如何裁剪图像,然后将其放在中心?
到目前为止,这就是我要做的…我已经成功裁剪了图像,但是我想在之后将其放在中间
ImgView.image = OrigImage var masklayer = CAShapeLayer() masklayer.frame = ImgView.frame masklayer.path = path.CGPath masklayer.fillColor = UIColor.whiteColor().CGColor masklayer.backgroundColor = UIColor.clearColor().CGColor ImgView.layer.mask = masklayer UIGraphicsBeginImageContext(ImgView.bounds.size); ImgView.layer.renderInContext(UIGraphicsGetCurrentContext()) var image = UIGraphicsGetImageFromCurrentImageContext() ImgView.image = image UIGraphicsEndImageContext();
更新:
let rect: CGRect = CGRectMake(path.bounds.minX, path.bounds.minY, path.bounds.width, path.bounds.height) // Create bitmap image from context using the rect let imageRef: CGImageRef = CGImageCreateWithImageInRect(image.CGImage, rect) ImgView.bounds = rect ImgView.image = UIImage(CGImage: imageRef)
我可以通过获取path.bound和size来居中,并更改ImageView的边界。:)
要获得作物的居中位置,可以将高度和宽度的差减半。然后,您可以在检查图像的方向(较长的部分)后为新的宽度和高度指定边界
func cropToBounds(image: UIImage, width: Double, height: Double) -> UIImage { let contextImage: UIImage = UIImage(CGImage: image.CGImage)! let contextSize: CGSize = contextImage.size var posX: CGFloat = 0.0 var posY: CGFloat = 0.0 var cgwidth: CGFloat = CGFloat(width) var cgheight: CGFloat = CGFloat(height) // See what size is longer and create the center off of that if contextSize.width > contextSize.height { posX = ((contextSize.width - contextSize.height) / 2) posY = 0 cgwidth = contextSize.height cgheight = contextSize.height } else { posX = 0 posY = ((contextSize.height - contextSize.width) / 2) cgwidth = contextSize.width cgheight = contextSize.width } let rect: CGRect = CGRectMake(posX, posY, cgwidth, cgheight) // Create bitmap image from context using the rect let imageRef: CGImageRef = CGImageCreateWithImageInRect(contextImage.CGImage, rect) // Create a new image based on the imageRef and rotate back to the original orientation let image: UIImage = UIImage(CGImage: imageRef, scale: image.scale, orientation: image.imageOrientation)! return image }
我在本网站上找到了大部分此类信息,以防您想进一步阅读。
为 Swift 4* 更新 *
func cropToBounds(image: UIImage, width: Double, height: Double) -> UIImage { let cgimage = image.cgImage! let contextImage: UIImage = UIImage(cgImage: cgimage) let contextSize: CGSize = contextImage.size var posX: CGFloat = 0.0 var posY: CGFloat = 0.0 var cgwidth: CGFloat = CGFloat(width) var cgheight: CGFloat = CGFloat(height) // See what size is longer and create the center off of that if contextSize.width > contextSize.height { posX = ((contextSize.width - contextSize.height) / 2) posY = 0 cgwidth = contextSize.height cgheight = contextSize.height } else { posX = 0 posY = ((contextSize.height - contextSize.width) / 2) cgwidth = contextSize.width cgheight = contextSize.width } let rect: CGRect = CGRect(x: posX, y: posY, width: cgwidth, height: cgheight) // Create bitmap image from context using the rect let imageRef: CGImage = cgimage.cropping(to: rect)! // Create a new image based on the imageRef and rotate back to the original orientation let image: UIImage = UIImage(cgImage: imageRef, scale: image.scale, orientation: image.imageOrientation) return image }