ios - How to convert CVImageBuffer to UIImage? -


i have temporary variable tmppixelbuffer pixel buffer data, not nil, , when metadata objects detected want create image buffer, crop metadata images image.

image nil, do wrong?

func captureoutput(captureoutput: avcaptureoutput!, didoutputsamplebuffer samplebuffer: cmsamplebuffer!, fromconnection connection: avcaptureconnection!) {      tmppixelbuffer = cmsamplebuffergetimagebuffer(samplebuffer) }   func captureoutput(captureoutput: avcaptureoutput!, didoutputmetadataobjects metadataobjects: [anyobject]!, fromconnection connection: avcaptureconnection!) {      let image = ciimage(cvpixelbuffer: tmppixelbuffer)     let context = cicontext()     let cgiimage = context.createcgimage(image, fromrect: image.extent())     let capturedimage = uiimage(cgimage: cgiimage)     ... } 

i tried that:

func captureoutput(captureoutput: avcaptureoutput!, didoutputmetadataobjects metadataobjects: [anyobject]!, fromconnection connection: avcaptureconnection!) {      let image = ciimage(cvpixelbuffer: tmppixelbuffer)     let context = cicontext(options: nil)      let cgiimage = context.createcgimage(image, fromrect: cgrect(x: 0, y: 0, width: int(cvpixelbuffergetwidth(tmppixelbuffer)), height: int(cvpixelbuffergetheight(tmppixelbuffer))))     ... } 

but in case uiimage not readable.

i don't know in swift, think can convert, c function taken apple , works perfectly.
the problem using ciimage create context quite expensive task, if want go way better build context before , keep strong reference it.
furthermore dont' remeber if default context build gpu or cpu, there other subtile differences between 2. instance if want make image creation on background thread on gpu won't work.

static cgfloat degreestoradians(cgfloat degrees) {return degrees * m_pi / 180;};  static void releasecvpixelbuffer(void *pixel, const void *data, size_t size) {     cvpixelbufferref pixelbuffer = (cvpixelbufferref)pixel;     cvpixelbufferunlockbaseaddress( pixelbuffer, 0 );     cvpixelbufferrelease( pixelbuffer ); }  // create cgimage provided pixel buffer, pixel buffer must uncompressed kcvpixelformattype_32argb or kcvpixelformattype_32bgra static osstatus createcgimagefromcvpixelbuffer(cvpixelbufferref pixelbuffer, cgimageref *imageout) {     osstatus err = noerr;     ostype sourcepixelformat;     size_t width, height, sourcerowbytes;     void *sourcebaseaddr = null;     cgbitmapinfo bitmapinfo;     cgcolorspaceref colorspace = null;     cgdataproviderref provider = null;     cgimageref image = null;      sourcepixelformat = cvpixelbuffergetpixelformattype( pixelbuffer );     if ( kcvpixelformattype_32argb == sourcepixelformat )         bitmapinfo = kcgbitmapbyteorder32big | kcgimagealphanoneskipfirst;     else if ( kcvpixelformattype_32bgra == sourcepixelformat )         bitmapinfo = kcgbitmapbyteorder32little | kcgimagealphanoneskipfirst;     else         return -95014; // uncompressed pixel formats      sourcerowbytes = cvpixelbuffergetbytesperrow( pixelbuffer );     width = cvpixelbuffergetwidth( pixelbuffer );     height = cvpixelbuffergetheight( pixelbuffer );     dlog(@"buffer image size %zu e %zu",width,height );     cvreturn val = cvpixelbufferlockbaseaddress( pixelbuffer, 0 );     if (val == kcvreturnsuccess) {          sourcebaseaddr = cvpixelbuffergetbaseaddress( pixelbuffer );          colorspace = cgcolorspacecreatedevicergb();          cvpixelbufferretain( pixelbuffer );         provider = cgdataprovidercreatewithdata( (void *)pixelbuffer, sourcebaseaddr, sourcerowbytes * height, releasecvpixelbuffer);         image = cgimagecreate(width, height, 8, 32, sourcerowbytes, colorspace, bitmapinfo, provider, null, true, kcgrenderingintentdefault);     } bail:     if ( err && image ) {         cgimagerelease( image );         image = null;     }     if ( provider ) cgdataproviderrelease( provider );     if ( colorspace ) cgcolorspacerelease( colorspace );     *imageout = image;     return err; }  // utility used newsquareoverlayedimageforfeatures static cgcontextref createcgbitmapcontextforsize(cgsize size) {     cgcontextref    context = null;     cgcolorspaceref colorspace;     int             bitmapbytesperrow;      bitmapbytesperrow = (size.width * 4);      colorspace = cgcolorspacecreatedevicergb();     context = cgbitmapcontextcreate (null,                                      size.width,                                      size.height,                                      8,      // bits per component                                      bitmapbytesperrow,                                      colorspace,                                      kcgimagealphapremultipliedlast);     cgcontextsetallowsantialiasing(context, no);     cgcolorspacerelease( colorspace );     return context; } 

Comments

Popular posts from this blog

cakephp - simple blog with croogo -

How to group boxplot outliers in gnuplot -

bash - Performing variable substitution in a string -