2015-08-15 7 views
6

У меня есть снимок всего экрана, screenshot, генерируется с помощью следующих действий:Swift: Обрезка Скриншот

let layer = UIApplication.sharedApplication().keyWindow!.layer 
let scale = UIScreen.mainScreen().scale 
UIGraphicsBeginImageContextWithOptions(layer.frame.size, false, scale); 

layer.renderInContext(UIGraphicsGetCurrentContext()) 
let screenshot = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 

Я хотел бы, чтобы обрезать его так, чтобы панель вкладок не включена, и я попытался используя следующий код:

let crop = CGRectMake(0, 0, //"start" at the upper-left corner 
self.view.bounds.width, //include half the width of the whole screen 
self.view.bounds.height + self.navigationController!.navigationBar.frame.height) //include the height of the navigationBar and the height of view 

let cgImage = CGImageCreateWithImageInRect(screenshot.CGImage, crop) 
let image: UIImage = UIImage(CGImage: cgImage)! 

Этот код приводит к image показывая лишь небольшую часть экрана, прямоугольник, начиная с верхнего левого угла экрана (0, 0), и расширение правый менее чем половину ширины экрана, затем вниз для менее чем га Высота экрана. Мне бы хотелось, чтобы он включил весь экран , за исключением области, занимаемой панелью вкладок. Есть ли такой способ обрезать его?

ответ

8

Согласно этому

Новому образом создается
1) регулировочного rect к интегральным ограничениям по телефону CGRectIntegral;
2) пересечение результата с прямоугольником с началом (0, 0) и размером , равным image;
3) ссылка на пиксели в результирующем прямоугольнике, обработка первого пикселя данных изображения в качестве источника изображения.
Если результирующий прямоугольник является нулевым прямоугольником, эта функция возвращает NULL.

Если W и H - ширина и высота изображения соответственно, то точка (0,0) соответствует первому пикселю данных изображения; точка (W-1, 0) является последним пикселем первой строки данных изображения; (0, H-1) - первый пиксель последней строки данных изображения; и (W-1, H-1) составляет последний пиксель последней строки данных изображения.

Вам понадобится такая функция растени. Вам может потребоваться скорректировать расчеты bottomBarHeight

func takeScreenshot(sender: AnyObject) { 
    let layer = UIApplication.sharedApplication().keyWindow!.layer 
    let scale = UIScreen.mainScreen().scale 
    UIGraphicsBeginImageContextWithOptions(layer.frame.size, false, scale); 

    layer.renderInContext(UIGraphicsGetCurrentContext()) 
    let screenshot = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    let croppedImage = self.cropImage(screenshot) 
} 

func cropImage(screenshot: UIImage) -> UIImage { 
    let scale = screenshot.scale 
    let imgSize = screenshot.size 
    let screenHeight = UIScreen.mainScreen().applicationFrame.height 
    let bound = self.view.bounds.height 
    let navHeight = self.navigationController!.navigationBar.frame.height 
    let bottomBarHeight = screenHeight - navHeight - bound 
    let crop = CGRectMake(0, 0, //"start" at the upper-left corner 
     (imgSize.width - 1) * scale, //include half the width of the whole screen 
     (imgSize.height - bottomBarHeight - 1) * scale) //include the height of the navigationBar and the height of view 

    let cgImage = CGImageCreateWithImageInRect(screenshot.CGImage, crop) 
    let image: UIImage = UIImage(CGImage: cgImage)! 
    return image 
} 
+0

Работает отлично - спасибо; щедрость придет. – Randoms

+0

Добро пожаловать :) – sahara108

3

скор:

let contextImage: UIImage = <<screenshot>>! 
let cropRect: CGRect = CGRectMake(x, y, width, height) 
let imageRef: CGImageRef = CGImageCreateWithImageInRect(contextImage.CGImage, cropRect) 
let image: UIImage = UIImage(CGImage: imageRef, scale: originalImage.scale, orientation: originalImage.imageOrientation)! 

Obj-C:

UIImage *image = <<screenshot>>; 

CGRect croprect = CGRectMake(0, 0, 
self.view.bounds.width, 
self.view.bounds.height + self.navigationController!.navigationBar.frame.height)); 

// Draw new image in current graphics context 
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], croprect); 

// Create new cropped UIImage 
UIImage *croppedImage = [UIImage imageWithCGImage:imageRef]; 
+0

Этот вопрос ищет ответ в Swift, а не Objective-C. – JAL

+0

My bad ... Я добавил swift –

1

У вас есть два варианта здесь: Во-первых, вы можете сделать снимок экрана с помощью UIApplication.sharedApplication().keyWindow тогда мы будем иметь это:

UIGraphicsBeginImageContext(UIApplication.sharedApplication().keyWindow!.bounds.size) 
    UIApplication.sharedApplication().keyWindow!.layer.renderInContext(UIGraphicsGetCurrentContext()) 
    let screenshot = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

Итак, вам нужно обрезать изображение следующим образом:

let yPosition = self.navigationController!.navigationBar.frame.height + UIApplication.sharedApplication().statusBarFrame.size.height 
    let crop = CGRectMake(0, yPosition, 
      self.view.bounds.width, 
      self.view.bounds.height) 
    let cgImage = CGImageCreateWithImageInRect(screenshot.CGImage, crop) 
    let image: UIImage = UIImage(CGImage: cgImage)! 

Второй вариант взять скриншот прямо на ваш взгляд, как это:

UIGraphicsBeginImageContext(self.view!.bounds.size) 
    self.view!.layer.renderInContext(UIGraphicsGetCurrentContext()) 
    let screenshot = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

В этом случае вам не нужно обрезать Панель навигации.

Это пример кода на GitHub https://github.com/gazolla/crop

+0

Ваше предложение обрезать изображение не похоже на то, что я хочу - это все еще только небольшая часть верхней левой части экрана. – Randoms

+0

Попробуйте использовать этот образец кода в github https://github.com/gazolla/crop – Sebastian

+0

Это отображает панель навигации, а не панель вкладок. – Randoms

0

Я думаю, что ваш урожай CGRect неправильно.

let crop = CGRectMake(0, 
         0, 
         self.view.frame.size.width, 
         self.view.frame.size.height + self.navigationController!.navigationBar.frame.height - self.tabBar.frame.size.height 
        ) 

X: 0 и Y: 0 - начать с 0, 0 соответственно.

Ширина: вся ширина захвата вида по

Высота: высота всего представления плюс высоту UINavigationBar минус высоту UITabBar.

+0

Извините, это все еще не работает для меня, я все еще вижу только верхний левый квадрант. Возможно, это связано с тем, с каким дисплеем я работаю (iPhone 6 Plus)? – Randoms

+0

Где вы звоните в этот код? Контроллер вида? Подраздел? – JAL

+0

Контроллер вида, в частности, действие кнопки навигации. – Randoms

 Смежные вопросы

  • Нет связанных вопросов^_^