-
-
Save MaTriXy/88fd3111175cdfb5c1fc9bea8efe89ad to your computer and use it in GitHub Desktop.
CVPixelBuffer通过vImage转换成CGImage
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Accelerate.vImage | |
func getImageBuffer(from pixelBuffer: CVPixelBuffer) -> vImage_Buffer? { | |
var buffer = vImage_Buffer() | |
let bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.first.rawValue) | |
var cgFormat = vImage_CGImageFormat(bitsPerComponent: 8, | |
bitsPerPixel: 32, | |
colorSpace: nil, | |
bitmapInfo: bitmapInfo, | |
version: 0, | |
decode: nil, | |
renderingIntent: .defaultIntent) | |
let cvFormat = vImageCVImageFormat_Create(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, | |
kvImage_ARGBToYpCbCrMatrix_ITU_R_709_2, | |
kCVImageBufferChromaLocation_TopLeft, | |
CGColorSpaceCreateDeviceRGB(), 0).takeRetainedValue() | |
var error: vImage_Error | |
error = vImageBuffer_InitWithCVPixelBuffer(&buffer, | |
&cgFormat, | |
pixelBuffer, | |
cvFormat, | |
nil, | |
vImage_Flags(0)) | |
guard error == kvImageNoError else { return nil } | |
return buffer | |
} | |
func getPixelBuffer(from buffer: vImage_Buffer, width: Int, height: Int) -> CVPixelBuffer? { | |
var buffer = buffer | |
let bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.first.rawValue) | |
var cgFormat = vImage_CGImageFormat(bitsPerComponent: 8, | |
bitsPerPixel: 32, | |
colorSpace: nil, | |
bitmapInfo: bitmapInfo, | |
version: 0, | |
decode: nil, | |
renderingIntent: .defaultIntent) | |
let cvFormat = vImageCVImageFormat_Create(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, | |
kvImage_ARGBToYpCbCrMatrix_ITU_R_709_2, | |
kCVImageBufferChromaLocation_TopLeft, | |
CGColorSpaceCreateDeviceRGB(), 0).takeRetainedValue() | |
var pixelBuffer: CVPixelBuffer? | |
let status = CVPixelBufferCreate(kCFAllocatorDefault, | |
width, | |
height, | |
kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, | |
nil, | |
&pixelBuffer) | |
guard status == kCVReturnSuccess else { return nil } | |
let error = vImageBuffer_CopyToCVPixelBuffer(&buffer, | |
&cgFormat, | |
pixelBuffer!, | |
cvFormat, | |
nil, | |
vImage_Flags(0)) | |
guard error == kvImageNoError else { return nil } | |
return pixelBuffer | |
} | |
func getCGImage(from buffer: vImage_Buffer) -> CGImage? { | |
var buffer = buffer | |
let bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.first.rawValue) | |
var cgFormat = vImage_CGImageFormat(bitsPerComponent: 8, bitsPerPixel: 32, colorSpace: nil, bitmapInfo: bitmapInfo, version: 0, decode: nil, renderingIntent: .defaultIntent) | |
var error: vImage_Error = kvImageNoError | |
let cgImage = vImageCreateCGImageFromBuffer(&buffer, &cgFormat, nil, nil, vImage_Flags(0), &error).takeRetainedValue() | |
guard error == kvImageNoError else { return nil } | |
return cgImage | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment