Маскирование UIImage
Я работаю над приложением, которое может изменять границы или прямоугольный UIImage. Границы будут различаться, но будет выглядеть так, как UIImage был вырезан ножницами или что-то в этом роде.
Каков наилучший способ сделать это?
Моя первая мысль - подготовить кучу прозрачных PNG с правильным эффектом границы, который я ищу, а затем как-то использовать это как маску для моего UIImage. Это правильный путь? Или существует более гибкий программный способ сделать это?
Ответы
Ответ 1
Ниже приведены вызовы 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);
Ответ 2
Для этого вам нужна маскировка изображений, я написал учебник о том, как его использовать и как я использовал его в своем приложении.
Следующий пример кода должен помочь вам приступить к работе, ему нужно исходное изображение и изображение маски в качестве входных данных, и оно возвращает изображение в масках в качестве вывода.
- (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
Да, это в значительной степени то, что вам нужно сделать. Лучший подход - использовать Core Graphics; в руководстве по двумерному программированию Quartz есть статья описывающая маскирование изображений с помощью других изображений. Вы можете получить CGImageRef
(который используют эти методы Core Graphics) из объекта UIImage
через его свойство CGImage
, а затем вернуть UIImage
из измененного (маскированного) CGImageRef
с помощью UIImage
класс +imageWithCGImage:
.
Ответ 4
Есть другой способ сделать это с помощью пути. Я разместил код, который делает это с кругом и может быть легко отредактирован для работы с любым закрытым контуром.
Как обрезать UIImage по овальной форме или форме круга?