2016-10-11 6 views
6

Я работаю над пользовательским приложением камеры. Все работает хорошо.Обрезать изображение снизу программно

Но я столкнулся с проблемой при обрезке изображения снизу. то есть обрезанное изображение имеет ту же самую ширину, что и исходное изображение, но высота будет 1/3 исходного изображения, и она должна начинаться со дна.

For Example Like this is the full image I need the red part only

ответ

17

Свифта 3 Решение:

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 
} 
0

Метод:

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") 
+0

Предположим, у меня есть размер изображения 2448 × 3264. Я хочу, чтобы эта часть была красной. Каковы параметры toRect? – BornShell

+0

Смотрите следующее: http://stackoverflow.com/questions/37946990/cgrectmake-cgpointmake-cgsizemake-cgrectzero-cgpointzero-is-unavailable-in –

7

это почти ответ Alexburtnik в

но только отметить, что UIImage.size является логический размер (в "точках")

однако, CGImage.cropping() используется фактический размер (в «пикселях»)

поэтому, если вы используете изображение с модификаторами @ 2x или @ 3x, вы обнаружите, что обрезка на самом деле составляет половину или треть ожидаемого.

поэтому при обрезке, вы можете рассмотреть умножая прямоугольник свойством «масштаб» образа первых, как показано в следующем:

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 
} 
0

В качестве расширения 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)