Маскировка изображений + Iphone SDK - PullRequest
5 голосов
/ 13 декабря 2011

Я хочу замаскировать два изображения

Изображение 1:

enter image description here

Изображение 2:

enter image description here

Теперь я хочу объединить эти два изображения, например, image2 появится в центре изображения 1.

Я прочитал Есть идеи, почему этот код маскировки изображений не работает? и «Как замаскировать изображение»

Но при использовании этой функции: -

- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage {
    CGImageRef maskRef = maskImage.CGImage;     
    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                        CGImageGetHeight(maskRef),
                                        CGImageGetBitsPerComponent(maskRef),
                                        CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
                                        CGImageGetDataProvider(maskRef), NULL, false);

    CGImageRef masked = CGImageCreateWithMask([image CGImage], mask);
    return [UIImage imageWithCGImage:masked];
}

Но с помощью этой функции я получил вывод: -

enter image description here

1 Ответ

1 голос
/ 25 мая 2013

Насколько я могу судить, проблема не в maskImage:withMask:. Неправильный вывод, который вы опубликовали, не является неправильным: там, где пиксели изображения1 черные, изображение2 не видно.

Возможно, проблема в функциях, которые вы использовали для загрузки image и mask, или в коде, создающем графический вывод. На самом деле мне кажется, что вы получили правильный вывод, но с использованием неправильного цветового пространства (оттенки серого без альфа). Проверьте, действительно ли указанный вами аргумент image представлен в формате RGBa, и не возвращается ли возвращенный UIImage в какой-либо другой CGContext с использованием DeviceGray в качестве цветового пространства.

Другая возможная причина, которая приходит мне в голову, это то, что вы перевернули image1 и image2. Согласно документации, mask должен быть увеличен до размера image (см. Ниже), но у вас есть маленькое изображение там. Это представляется разумным также и потому, что image1 находится в градациях серого, хотя, когда я попытался поменять местами image1 и image2, я получил image1 неизмененным в качестве вывода.


Для запуска тестов я использовал прикрепленные изображения, а затем скопировал и вставил метод -(UIImage *)maskImage:(UIImage *)image withMask:(UIImage *)maskImage как есть.

Я использовал простой проект iOS с одним представлением и UIImageView внутри (с тегом 1) и следующий код в контроллере:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    UIImageView *imageView=(UIImageView *)[self.view viewWithTag:1];

    UIImage *im1=[UIImage imageNamed:@"image1"];
    UIImage *im2=[UIImage imageNamed:@"image2"];

    imageView.image=[self maskImage:im2 withMask:im1];

}

Я получаю следующий вывод (который является правильным):

image2 using image1 as mask

Если по ошибке вы инвертируете im1 с помощью im2, вы получите вместо image1 неизменное.

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