UIImagePNGПредставление и замаскированные изображения

  1. Я создал замаскированное изображение с помощью функции сформируйте блог iphone:

    UIImage * imgToSave = [self 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. UIImagePNGПредставление для сохранения на диск:

    [UIImagePNGRepresentation (imgToSave) writeToFile: [self findUniqueSavePath] атомарно: ДА];

UIImagePNGRepresentation возвращает NSData изображения, которое выглядит иначе.

На выходе получается маска обратного изображения. Область, которая была вырезана в приложении, теперь отображается в файле. Область, которая была видна в приложении, теперь удалена. Видимость противоположная.

Моя маска предназначена для удаления всего, кроме лица на картинке. UIImage выглядит прямо в приложении, но после сохранения на диск файл выглядит противоположным. Лицо удалено, но все остальное есть.

Пожалуйста, дайте мне знать, если сможете помочь!


person Alex L    schedule 15.11.2010    source источник
comment
В итоге я использовал изображение обратной маски для сохранения.   -  person Alex L    schedule 12.01.2011


Ответы (2)


У меня была точно такая же проблема, когда я сохранил файл, это было одностороннее, но изображение, возвращенное в память, было прямо противоположным.

Виновником и решением была 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
person Travis Weerts    schedule 12.09.2013

В кварце вы маскируете либо маской изображения (черные пропускают и белые блоки), либо нормальным изображением (белые пропускают и черные блоки), что является противоположным. Похоже, что по какой-то причине при сохранении маска изображения рассматривается как обычное изображение для маскировки. Одна мысль состоит в том, чтобы выполнить рендеринг в контексте растрового изображения, а затем создать изображение, которое будет сохранено из него.

person fhj    schedule 16.11.2010