маскировка UIImage - PullRequest
12 голосов
/ 06 мая 2010

Я работаю над приложением, которое может изменять границы или прямоугольный UIImage. Границы будут меняться, но будут выглядеть, как UIImage был вырезан с помощью ножниц, или что-то в этом роде.

Каков наилучший способ сделать это?

Моя первая мысль - подготовить несколько прозрачных PNG с нужным мне эффектом границы, а затем каким-то образом использовать это в качестве маски для моего UIImage. Это правильный путь? Или есть более гибкий программный способ сделать это?

Ответы [ 4 ]

25 голосов
/ 14 января 2011

Вот вызовы Core Graphics, которые вы можете использовать для маскировки изображения:

//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);
6 голосов
/ 08 ноября 2012

Для этого вам нужна маскировка изображений, я написал учебник о том, как его использовать и как я использовал его в своем собственном приложении.

Следующий пример кода должен помочь вам начать работу, ему нужно исходное изображение и изображение маски в качестве входных данных, и он возвращает замаскированное изображение в качестве выходных данных.

- (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;
}
3 голосов
/ 14 января 2011

Да, это в значительной степени то, что вам нужно сделать. Лучший подход - использовать Core Graphics; Руководство по программированию в Quartz 2D содержит статью , в которой описано, как маскировать изображения другими изображениями . Вы можете получить CGImageRef (который используют эти методы Core Graphics) из UIImage объекта через его свойство CGImage, а затем получить UIImage обратно из вашего измененного (замаскированного) CGImageRef, используя UIImage метод класса +imageWithCGImage:.

0 голосов
/ 25 февраля 2013

Есть еще один способ сделать это с помощью пути. Я разместил код, который делает это с кружком и может быть легко отредактирован для работы с любым замкнутым путем.

Как обрезать UIImage по овальной или круглой форме?

...