AVCaptureVideoPreviewLayer прямо в формате JPEG? - PullRequest
0 голосов
/ 09 января 2020

Я ищу способ взять CGRect, определяющий часть AVCaptureVideoPreviewLayer, и превратить его содержимое в данные jpeg.

Так есть ли способ сделать снимок части AVCaptureVideoPreviewLayer в jpeg?

Я первоначально сказал CALayer, но я должен был сказать AVCaptureVideoPreviewLayer. Я не могу отобразить в изображении содержимое AVCaptureVideoPreviewLayer.

Возможно, мне придется закрыть этот вопрос и начать сначала с «AVCaptureVideoPreviewLayer»?

Ответы [ 2 ]

1 голос
/ 10 января 2020

По какой-то причине нет API CALayer, которое не может рисовать часть слоя (возможно, потому что прерывистое чтение из графической памяти дорого), поэтому просто растеризируем все это, затем обрезаем нужную часть и конвертируем ее в JPG. Вот пример детской площадки:

import PlaygroundSupport

let label = UILabel()
label.text = "test"
label.sizeToFit()
let layerImage = UIGraphicsImageRenderer(bounds: label.bounds).image { context in
  label.layer.draw(in: context.cgContext)
}
let cropRect = label.bounds.inset(by: .init(top: 2, left: 2, bottom: 2, right: 2))
let croppedImage = UIGraphicsImageRenderer(bounds: .init(origin: .zero, size: cropRect.size)).image { context in
  layerImage.draw(at: .init(x: (cropRect.size.width - layerImage.size.width) / 2, y: (cropRect.size.height - layerImage.size.height) / 2))
}
let jpg = croppedImage.jpegData(compressionQuality: 0.5)
1 голос
/ 09 января 2020

Только UIImage имеет данные JPEG. Так что визуализируйте весь слой в UIImage, обрежьте UIImage по желанию (я полагаю, вы знаете, как это сделать) и извлеките данные jpeg.

...