void *pxdata = cvpixelbuffergetbaseaddress(pxbuffer);
然后在创建上下文以pxdata 所指向的内存作为上下文数据存贮的容器, 最后 渲染 上下文[self.webview.layer renderincontext:context];
这样就将 webview 视图上的渲染数据转成了一帧 cvpixelbufferref 数据, 然后根据帧率设置定时器, 去不停的获取webview的渲染数据转换成需要像素缓冲数据!
具体的代码如下
- (cvpixelbufferref)cvpixelbufferref {
cgsize size = self.frame.size;
nsdictionary *options = @{(nsstring*)kcvpixelbuffercgimagecompatibilitykey : @yes,
(nsstring*)kcvpixelbuffercgbitmapcontextcompatibilitykey : @yes,
(nsstring*)kcvpixelbufferiosurfacepropertieskey: [nsdictionary dictionary]};
cvpixelbufferref pxbuffer = null;
cgfloat framewidth = size.width;
cgfloat frameheight = size.height;
cvreturn status = cvpixelbuffercreate(kcfallocatordefault,
framewidth,
frameheight,
kcvpixelformattype_32argb,
(__bridge cfdictionaryref) options,
&pxbuffer);
nsparameterassert(status == kcvreturnsuccess && pxbuffer != null);
cvpixelbufferlockbaseaddress(pxbuffer, 0);
void *pxdata = cvpixelbuffergetbaseaddress(pxbuffer);
nsparameterassert(pxdata != null);
cgcolorspaceref rgbcolorspace = cgcolorspacecreatedevicergb();
cgcontextref context = cgbitmapcontextcreate(pxdata, size.width, size.height, 8, cvpixelbuffergetbytesperrow(pxbuffer), rgbcolorspace, kcgimagealphapremultipliedfirst);
nsparameterassert(context);
cgcontextconcatctm(context, cgaffinetransformmakerotation(0));
cgaffinetransform flipvertical = cgaffinetransformmake( 1, 0, 0, -1, 0, frameheight);
cgcontextconcatctm(context, flipvertical);
// cgaffinetransform fliphorizontal = cgaffinetransformmake( -1.0, 0.0, 0.0, 1.0, framewidth, 0.0 );
// cgcontextconcatctm(context, fliphorizontal);
[self.webview.layer renderincontext:context];
cgcolorspacerelease(rgbcolorspace);
cgcontextrelease(context);
cvpixelbufferunlockbaseaddress(pxbuffer, 0);
return pxbuffer;
}
这或许不是最好的方法, 但目前确实解决了燃眉之急, 分享出来, 为有同样需求的小伙伴提供一条方案, 或者小伙伴有更好的方法, 分享出来, 大家可以学习交流一下
或者上我的简书
如对本文有疑问, 点击进行留言回复!!
HDU - 5532 A - Almost Sorted Array
react native 实现扫描条形码功能(react-native-camera)
网友评论