Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import UIKit
- class AdvancedCroppingViewController: UIViewController {
- var imageContainer:UIView!
- var image:UIImage!
- var topImage:UIImage!
- var imageView:ZoomRotatePanImageView!
- var topImageView:UIImageView!
- var fillerView1:UIView!
- var fillerView2:UIView!
- var centerPoint:CGPoint!
- var tw:CGFloat!
- var th:CGFloat!
- var tx:CGFloat!
- var ty:CGFloat!
- var iw:CGFloat!
- var ih:CGFloat!
- var ix:CGFloat!
- var iy:CGFloat!
- var iratio:CGFloat!
- override func viewDidLoad() {
- super.viewDidLoad()
- loadImages()
- }
- func loadImages(){
- topImage = UIImage(named: topImageName)
- topImageView = UIImageView(image: topImage)
- imageView = ZoomRotatePanImageView(image: image)
- let w = self.view.frame.width
- let h = self.view.frame.height
- //TOP IMAGE
- let ratioW:CGFloat = w / topImage.size.width
- let ratioH:CGFloat = h / topImage.size.height
- let ratio:CGFloat = ratioW < ratioH ? ratioW : ratioH //Aspect Fit
- tw = topImage.size.width * ratio
- th = topImage.size.height * ratio
- tx = (w - tw) / 2.0
- ty = (h - th) / 2.0
- topImageView.frame = CGRectMake(tx, ty, tw, th)
- //FILLER VIEWS
- if(tx > 0){
- fillerView1 = UIView(frame: CGRectMake(0, 0, tx, th))
- fillerView2 = UIView(frame: CGRectMake(w - tx, 0, tx, th))
- }
- else{
- fillerView1 = UIView(frame: CGRectMake(0, 0, w, ty))
- fillerView2 = UIView(frame: CGRectMake(0, h - ty, w, ty))
- }
- fillerView1.backgroundColor = UIColor.whiteColor()
- fillerView2.backgroundColor = UIColor.whiteColor()
- //IMAGE
- imageContainer = UIView(frame: CGRectMake(0, 0, w, h))
- imageContainer.backgroundColor = UIColor.whiteColor()
- let iratioW:CGFloat = w / image.size.width
- let iratioH:CGFloat = h / image.size.height
- iratio = iratioW > iratioH ? iratioW : iratioH //Aspect Fill
- iw = image.size.width * iratio
- ih = image.size.height * iratio
- ix = (w - iw) / 2.0
- iy = (h - ih) / 2.0
- imageView.frame = CGRectMake(ix, iy, iw, ih)
- centerPoint = imageView.center
- imageContainer.addSubview(imageView)
- self.view.addSubview(imageContainer)
- self.view.addSubview(topImageView)
- self.view.addSubview(fillerView1)
- self.view.addSubview(fillerView2)
- print("Loaded image size: \(image.size)")
- }
- override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
- let boundsScale = imageView.bounds.size.width / imageView.bounds.size.height
- let imageScale = image!.size.width / image!.size.height
- let size = (image?.size)!
- var canvasSize = size
- if boundsScale > imageScale {
- canvasSize.width = canvasSize.height * boundsScale
- }
- else{
- canvasSize.height = canvasSize.width / boundsScale
- }
- let xScale = canvasSize.width / imageView.bounds.width
- let yScale = canvasSize.height / imageView.bounds.height
- let center = CGPointApplyAffineTransform(imageView.center, CGAffineTransformScale(CGAffineTransformIdentity, xScale, yScale))
- let xCenter = center.x
- let yCenter = center.y
- UIGraphicsBeginImageContextWithOptions(canvasSize, false, 0);
- let context = UIGraphicsGetCurrentContext()!
- //Apply transformation
- CGContextTranslateCTM(context, xCenter, yCenter)
- CGContextConcatCTM(context, imageView.transform)
- CGContextTranslateCTM(context, -xCenter, -yCenter)
- var drawingRect : CGRect = CGRectZero
- drawingRect.size = canvasSize
- //Transaltion
- drawingRect.origin.x = (xCenter - size.width*0.5)
- drawingRect.origin.y = (yCenter - size.height*0.5)
- //Aspectfit calculation
- if boundsScale > imageScale {
- drawingRect.size.width = drawingRect.size.height * imageScale
- }else{
- drawingRect.size.height = drawingRect.size.width / imageScale
- }
- image!.drawInRect(drawingRect)
- let preview = UIGraphicsGetImageFromCurrentImageContext()
- UIGraphicsEndImageContext()
- let previewVC = segue.destinationViewController as! PreviewViewController
- previewVC.preview = preview
- //OLD METHOD
- // UIGraphicsBeginImageContextWithOptions(imageContainer.bounds.size, false, 0)
- // self.imageContainer.drawViewHierarchyInRect(imageContainer.bounds, afterScreenUpdates: true)
- // let screenshot = UIGraphicsGetImageFromCurrentImageContext()!
- // UIGraphicsEndImageContext()
- // let cropRect = CGRectMake(tx, ty, tw, th)
- // let preview = getSubImageFrom(screenshot, rect: cropRect)
- // let previewVC = segue.destinationViewController as! PreviewViewController
- // previewVC.preview = preview
- }
- func getSubImageFrom(img:UIImage!, rect:CGRect) -> UIImage! {
- UIGraphicsBeginImageContext(rect.size)
- let context = UIGraphicsGetCurrentContext()
- let drawRect = CGRectMake(-rect.origin.x, -rect.origin.y, img.size.width, img.size.height)
- CGContextClipToRect(context, CGRectMake(0, 0, rect.size.width, rect.size.height))
- img.drawInRect(drawRect)
- let subImage = UIGraphicsGetImageFromCurrentImageContext()
- UIGraphicsEndImageContext()
- return subImage
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement