маскирование UIImage

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

Как лучше всего это сделать?

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


person Steven Baughman    schedule 05.05.2010    source источник


Ответы (4)


Вот вызовы 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);
person Reed Olsen    schedule 13.01.2011
comment
БЛАГОДАРНОСТЬ! Стало интересно, как это сделать. Для потомков в вашем первом распределении UIImage есть небольшая опечатка: должно быть указано imageNamed, как и во втором. - person dooleyo; 08.08.2013
comment
Необходимо обновить imageWithCGImage: до imageWIthCGImage:scale:orientation: - person jowie; 09.07.2015

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

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

- (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;
}
person Jeroen    schedule 08.11.2012
comment
Я просматривал это, и, к сожалению, я просто не могу заставить его работать. Я помещаю изображение в первый параметр, затем черно-белое изображение во второй, оба одинакового размера, и вывод точно такой же, как и первое изображение. - person jowie; 09.07.2015
comment
Ваша ссылка на урок не работает. - person capikaw; 09.09.2016

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

person Noah Witherspoon    schedule 13.01.2011
comment
CGImage из UIImage имеет значение null, если оно было создано из CIImage, поэтому будьте осторожны. - person Aggressor; 26.09.2014

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

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

person Chris Nelson    schedule 25.02.2013