2010-05-05 12 views
12

Pracuję nad aplikacją, która może zmienić granice lub prostokątną UIImage. Granice będą się różnić, ale będą wyglądać tak, jakby UIImage został wycięty nożyczkami lub czymś takim.maskowanie UIImage

Jaki jest najlepszy sposób na zrobienie tego?

Moja pierwsza myśl polega na przygotowaniu grupy przezroczystych plików PNG z odpowiednim efektem granicy, którego szukam, a następnie w jakiś sposób wykorzystam to jako maskę dla mojej UIImage. Czy to właściwa ścieżka? Czy istnieje bardziej elastyczny programowy sposób na zrobienie tego?

Odpowiedz

24

Oto rdzeń graficzny nazywa, które można wykorzystać w celu maskowania obrazu:

//Mask Image 
UIImage *inputImage = [UIImage imageNamed:@"inputImage.png"]; 
CGImageRef maskRef = [UIImage imageNamed:@"mask.png"].CGImage; 

CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
            CGImageGetHeight(maskRef), 
            CGImageGetBitsPerComponent(maskRef), 
            CGImageGetBitsPerPixel(maskRef), 
            CGImageGetBytesPerRow(maskRef), 
            CGImageGetDataProvider(maskRef), NULL, false); 

CGImageRef masked = CGImageCreateWithMask([inputImage CGImage], mask); 
CGImageRelease(mask); 

UIImage *maskedImage = [UIImage imageWithCGImage:masked]; 

CGImageRelease(masked); 
+0

DZIĘKI! Zastanawiałem się, jak to zrobić. Dla potomności pojawia się mała literówka w pierwszym przydziale UIImage: powinieneś powiedzieć "imageNamed" tak jak twój drugi. – dooleyo

+0

Potrzebne do aktualizacji 'imageWithCGImage:' do 'imageWIthCGImage: scale: orientation:' – jowie

+0

Bardzo podobne do http://stackoverflow.com/a/5757417 – danh

3

Tak, to prawie wszystko, co musisz zrobić. Najlepszym podejściem jest wykorzystanie Core Graphics; Przewodnik programowania w Quartz 2D ma numer article describing how to mask images with other images. Możesz uzyskać wartość CGImageRef (używaną przez te metody Core Graphics) z obiektu UIImage za pomocą jej właściwości , a następnie pobrać UIImage z powrotem z zmodyfikowanego (zamaskowanego) CGImageRef przy użyciu metody klasy UIImage.

+1

CGImage z UIImage jest nieważna, jeżeli został utworzony z CIImage więc należy być ostrożnym. – Aggressor

6

Trzeba maskowanie obrazu na to, napisałem tutorial on how to use it i jak użyłem go we własnej aplikacji.

Poniższy przykładowy kod powinien pomóc w rozpoczęciu pracy, potrzebuje oryginalnego obrazu i obrazu maski jako danych wejściowych i zwraca zamaskowany obraz jako wynik.

- (UIImage*) maskImage:(UIImage *) image withMask:(UIImage *) mask 
{ 
    CGImageRef imageReference = image.CGImage; 
    CGImageRef maskReference = mask.CGImage; 

    CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskReference), 
              CGImageGetHeight(maskReference), 
              CGImageGetBitsPerComponent(maskReference), 
              CGImageGetBitsPerPixel(maskReference), 
              CGImageGetBytesPerRow(maskReference), 
              CGImageGetDataProvider(maskReference), 
              NULL, // Decode is null 
              YES // Should interpolate 
              ); 

    CGImageRef maskedReference = CGImageCreateWithMask(imageReference, imageMask); 
    CGImageRelease(imageMask); 

    UIImage *maskedImage = [UIImage imageWithCGImage:maskedReference]; 
    CGImageRelease(maskedReference); 

    return maskedImage; 
} 
+0

Przeglądałem to i niestety po prostu nie mogę go uruchomić . Umieściłem obraz w pierwszym parametrze, niż obraz czarno-biały w drugim, oba o tym samym rozmiarze, a wynik jest dokładnie taki sam jak pierwszego obrazu. – jowie

+0

Twój tutorialowy link jest uszkodzony. – capikaw