Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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:.