Уведомление
Недавно я должен был написать эту функцию еще раз, и обнаружили, что этот метод не похоже на работу больше (по крайней мере, я не мог заставить его работать на IOS 10.3.1). Выходное изображение не будет выравниваться. Я предполагаю, что это из-за неправильного bytesPerRow
.
Оригинал ответ
Буфер просто массив пикселей, так что вы на самом деле можете обрабатывать буфер непосредственно без использования vImage. Код написан в Swift, но я думаю, что легко найти эквивалент Objective-C.
Swift 3
let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
CVPixelBufferLockBaseAddress(imageBuffer, .readOnly)
let baseAddress = CVPixelBufferGetBaseAddress(imageBuffer)
let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer)
let cropWidth = 640
let cropHeight = 640
let colorSpace = CGColorSpaceCreateDeviceRGB()
let context = CGContext(data: baseAddress, width: cropWidth, height: cropHeight, bitsPerComponent: 8, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: CGImageAlphaInfo.noneSkipFirst.rawValue | CGBitmapInfo.byteOrder32Little.rawValue)
CVPixelBufferUnlockBaseAddress(imageBuffer, .readOnly)
// create image
let cgImage: CGImage = context!.makeImage()!
let image = UIImage(cgImage: cgImage)
Swift 2
let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
CVPixelBufferLockBaseAddress(imageBuffer, 0)
let baseAddress = CVPixelBufferGetBaseAddress(imageBuffer)
let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer)
let cropWidth = 640
let cropHeight = 640
let colorSpace = CGColorSpaceCreateDeviceRGB()
let context = CGBitmapContextCreate(baseAddress, cropWidth, cropHeight, 8, bytesPerRow, colorSpace, CGImageAlphaInfo.NoneSkipFirst.rawValue | CGBitmapInfo.ByteOrder32Little.rawValue)
// create image
let cgImage: CGImageRef = CGBitmapContextCreateImage(context)!
let image = UIImage(CGImage: cgImage)
Если вы хотите обрезать с какой-то конкретной позиции, добавьте следующий код:
// calculate start position
let bytesPerPixel = 4
let startPoint = [ "x": 10, "y": 10 ]
let startAddress = baseAddress + startPoint["y"]! * bytesPerRow + startPoint["x"]! * bytesPerPixel
и изменения baseAddress
в CGBitmapContextCreate
- startAddress
. Не превышайте ширину и высоту изображения оригинала.
Привет, Стив, я искал руководство для примера обрезки, но не мог его отличить, можно ли привести пример, как обрезать буфер напрямую? – Eyal
vImage не имеет функций обрезки – AlexeyVMP
Правильно, что vimage не имеет выделенной функции обрезки. Но, установив размер буфера, вы можете применить урожай вместе с практически любой функцией, например. масштаб. Я обновил свой ответ на примере – Sten