2010-11-15 85 views
3
  1. 使用function形式的iphone博客創建的掩蔽圖像UIImagePNGRepresentation和掩蔽圖像

    的UIImage * imgToSave = [自maskImage:[UIImage的imageNamed:@ 「pic.jpg」] withMask: [UIImage imageNamed:@「sd-face-mask.png」]];

  2. 在一個UIImageView

    UIImageView *imgView = [[UIImageView alloc] initWithImage:imgToSave]; 
    imgView.center = CGPointMake(160.0f, 140.0f); 
    [self.view addSubview:imgView]; 
    
  3. UIImagePNGRepresentation看起來不錯保存到磁盤

    [UIImagePNGRepresentation(imgToSave)將writeToFile:[自findUniqueSavePath]原子:YES];

UIImagePNGRepresentation返回,看起來不同的圖像的NSData的。

輸出是反轉圖像掩膜。 在應用程序中切出的區域現在可以在文件中看到。 現在應用程序中可見的區域被刪除。能見度是相對。

我的面具旨在除去圖片中面部區域以外的所有東西。 UIImage在應用程序中看起來很正確,但在將它保存在磁盤上後,該文件看起來相反。臉部被刪除,但一切都在那裏。

請讓我知道,如果你能幫助!

+0

我結束了使用逆掩模圖像進行保存。 – 2011-01-12 19:59:03

回答

0

我有完全相同的問題,當我保存文件是一種方式,但在內存中返回的圖像是完全相反的。

匪徒&解決方案是UIImagePNGRepresentation()。它在將應用程序內的圖像保存到磁盤之前修復了它,因此我只是將該函數作爲創建蒙版圖像的最後一步插入並返回。

這可能不是最優雅的解決方案,但它的工作原理。我從我的應用程序中複製了一些代碼並壓縮了它,不確定下面的代碼是否按原樣運行,但如果不符合,它的結束...也許只是一些錯別字。

享受。 :)

// 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 to make the "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 from bimap context. 
    CGImageRef grayScaleImage = CGBitmapContextCreateImage(bitmapContext); 
    CGContextRelease(bitmapContext); 
    //image is inverted. UIImage inverts orientation while converting CGImage to UIImage. 
    UIImage* image = [UIImage imageWithCGImage:grayScaleImage]; 
    CGImageRelease(grayScaleImage); 
    return image; 
} 

@end 
+0

感謝您分享您的代碼! – 2013-09-15 19:44:53

3

在石英中,您可以通過圖像蒙版(黑色通過和白色方塊)或正常圖像(白色通過和黑色方塊)對相機進行攝像。看起來由於某種原因,保存是將圖像蒙板當作正常圖像來掩蓋。一個想法是渲染到位圖上下文,然後創建一個圖像以從中保存。