iphone - UIImagePNGRepresentation and masked images -


  1. i created masked image using function form iphone blog:

    uiimage *imgtosave = [self maskimage:[uiimage imagenamed:@"pic.jpg"] withmask:[uiimage imagenamed:@"sd-face-mask.png"]];

  2. looks in uiimageview

    uiimageview *imgview = [[uiimageview alloc] initwithimage:imgtosave]; imgview.center = cgpointmake(160.0f, 140.0f); [self.view addsubview:imgview]; 
  3. uiimagepngrepresentation save disk:

    [uiimagepngrepresentation(imgtosave) writetofile:[self finduniquesavepath] atomically:yes];

uiimagepngrepresentation returns nsdata of image looks different.

the output inverse image mask. area cut out in app visible in file. area visible in app removed. visibility opposite.

my mask designed remove face area in picture. uiimage looks right in app after save on disk, file looks opposite. face removed else there.

please let me know if can help!

i had exact same issue, when saved file 1 way, image returned in memory exact opposite.

the culprit & solution uiimagepngrepresentation(). fixes in-app image before saving disk, inserted function last step in creating masked image , returning that.

this may not elegant solution, works. copied code app , condensed it, not sure if code below works is, if not, close... maybe typos.

enjoy. :)

// myimagehelperobj.h  @interface myimagehelperobj : nsobject  + (uiimage *) creategrayscaleimage:(uiimage*)originalimage; + (uiimage *) createmaskedimagewithsize:(cgsize)newsize sourceimage:(uiimage *)sourceimage maskimage:(uiimage *)maskimage;  @end      // myimagehelperobj.m  #import <quartzcore/quartzcore.h> #import "myimagehelperobj.h"   @implementation myimagehelperobj   + (uiimage *) createmaskedimagewithsize:(cgsize)newsize sourceimage:(uiimage *)sourceimage maskimage:(uiimage *)maskimage; {     // create image size rect     cgrect newrect = cgrectzero;     newrect.size = newsize;      // draw source image     uigraphicsbeginimagecontextwithoptions(newrect.size, no, 0.0f);     [sourceimage drawinrect:newrect];     uiimage *newimage = uigraphicsgetimagefromcurrentimagecontext();      // draw mask image     [maskimage drawinrect:newrect blendmode:kcgblendmodenormal alpha:1.0f];     maskimage = uigraphicsgetimagefromcurrentimagecontext();     uigraphicsendimagecontext();      // create grayscale version of mask image make "image mask"     uiimage *grayscalemaskimage = [myimagehelperobj creategrayscaleimage:maskimage];     cgfloat width = cgimagegetwidth(grayscalemaskimage.cgimage);     cgfloat height = cgimagegetheight(grayscalemaskimage.cgimage);     cgfloat bitsperpixel = cgimagegetbitsperpixel(grayscalemaskimage.cgimage);     cgfloat bytesperrow = cgimagegetbytesperrow(grayscalemaskimage.cgimage);     cgdataproviderref providerref = cgimagegetdataprovider(grayscalemaskimage.cgimage);     cgimageref imagemask = cgimagemaskcreate(width, height, 8, bitsperpixel, bytesperrow, providerref, null, false);      cgimageref maskedimage = cgimagecreatewithmask(newimage.cgimage, imagemask);     cgimagerelease(imagemask);     newimage = [uiimage imagewithcgimage:maskedimage];     cgimagerelease(maskedimage);     return [uiimage imagewithdata:uiimagepngrepresentation(newimage)]; }  + (uiimage *) creategrayscaleimage:(uiimage*)originalimage; {     //create gray device colorspace.     cgcolorspaceref space = cgcolorspacecreatedevicegray();     //create 8-bit bimap context without alpha channel.     cgcontextref bitmapcontext = cgbitmapcontextcreate(null, originalimage.size.width, originalimage.size.height, 8, 0, space, kcgimagealphanone);     cgcolorspacerelease(space);     //draw image.     cgrect bounds = cgrectmake(0.0, 0.0, originalimage.size.width, originalimage.size.height);     cgcontextdrawimage(bitmapcontext, bounds, originalimage.cgimage);     //get image bimap context.     cgimageref grayscaleimage = cgbitmapcontextcreateimage(bitmapcontext);     cgcontextrelease(bitmapcontext);     //image inverted. uiimage inverts orientation while converting cgimage uiimage.     uiimage* image = [uiimage imagewithcgimage:grayscaleimage];     cgimagerelease(grayscaleimage);     return image; }  @end 

Comments

Popular posts from this blog

android - Spacing between the stars of a rating bar? -

aspxgridview - Devexpress grid - header filter does not work if column is initially hidden -

c# - How to execute a particular part of code asynchronously in a class -