iOS YUV(i420) to UIImage
最编程
2024-08-15 15:43:46
...
思路:YUV(i420) -> YUV(NV12) -> CIImage -> UIImage
获取到的YUV Data格式:
(int width,
int height,
unsigned long long time_stamp,
unsigned char*yData,
unsigned char* uData,
unsigned char*vData,
int yStride,
int uStride,
int vStride)
将YUV分量填入buffer 得到标准buffer
I420: YYYYYYYY UU VV -> NV12: YYYYYYYY UVUV
附上YUV图解:https://blog.****.net/xjhhjx/article/details/80291465
NSDictionary *pixelAttributes = @{(NSString *)kCVPixelBufferIOSurfacePropertiesKey:@{}};
CVPixelBufferRef pixelBuffer = NULL;
CVReturn result = CVPixelBufferCreate(kCFAllocatorDefault,
width,
height,
kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, // NV12
(__bridge CFDictionaryRef)(pixelAttributes),
&pixelBuffer);
if (result != kCVReturnSuccess) {
NSLog(@"Unable to create cvpixelbuffer %d", result);
}
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
unsigned char *yDestPlane = (unsigned char *)CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0);
for (int i = 0, k = 0; i < height; i ++) {
for (int j = 0; j < width; j ++) {
yDestPlane[k++] = yData[j + i * yStride];
}
}
unsigned char *uvDestPlane = (unsigned char *)CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1);
for (int i = 0, k = 0; i < height / 2; i ++) {
for (int j = 0; j < width / 2; j ++) {
uvDestPlane[k++] = uData[j + i * uStride];
uvDestPlane[k++] = vData[j + i * vStride];
}
}
CIImage Conversion
CIImage *coreImage = [CIImage imageWithCVPixelBuffer:pixelBuffer];
CIContext *MytemporaryContext = [CIContext contextWithOptions:nil];
CGImageRef MyvideoImage = [MytemporaryContext createCGImage:coreImage
fromRect:CGRectMake(0, 0, width, height)];
UIImage Conversion
UIImage *Mynnnimage = [[UIImage alloc] initWithCGImage:MyvideoImage
scale:1.0
orientation:UIImageOrientationUp];
CVPixelBufferRelease(pixelBuffer);
CGImageRelease(MyvideoImage);
推荐阅读
-
解密Android Bitmap转I420的难题,附图文详解YUV420数据格式
-
如何实现neon优化的yuv420转rgb24汇编代码,iOS/Android可用的具体操作步骤
-
转化图像为YUV420 I420格式:利用OpenCV处理
-
【Codecs】YUV主要格式YV12,I420,YUV420P的区别
-
深入解析YUV格式(I420/YUV420/NV12/NV12/YUV422)
-
常用图像像素格式 NV12、NV2、I420、YV12、YUYV-常用图像像素格式 RGB 和 YUV
-
比较YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P和YUV444P:理解并解析YUV420P的不同之处
-
深入解析YUV格式(I420/YUV420/NV12/NV12/YUV422)
-
比较YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P和YUV444P的图解差异
-
不同YUV格式的解读:YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P和YUV444P的差异解析