смешайте два uiimages на основе альфы/прозрачности главного изображения

Values добирается ICollection содержащий значения Вашего словаря. Как подразумевается определением Вашего словаря, это может быть определено как ICollection> набор. Таким образом, если Вы действительно хотите IList>, используйте решение spacedog .

, Если то, что Вы действительно хотите, является плоским 'IList', затем нет никакого другого решения, чем цикличное выполнение через каждое значение:

IList l=new List();
foreach (IList v in myDictionary.Values)
    l.AddRange(v);

Примечание, что это столь чрезвычайно неэффективно, что необходимо думать снова об использовании словаря для того, чего Вы пытаетесь достигнуть.

32
задан ToolmakerSteve 10 March 2017 в 04:11
поделиться

5 ответов

UIImage* bottomImage = [UIImage imageNamed:@"bottom.png"];  
UIImage* topImage    = [UIImage imageNamed:@"top.png"];
UIImageView* imageView = [[UIImageView alloc] initWithImage:bottomImage];
UIImageView* subView   = [[UIImageView alloc] initWithImage:topImage];
subView.alpha = 0.5;  // Customize the opacity of the top image.
[imageView addSubview:subView];
UIGraphicsBeginImageContext(imageView.frame.size);
[imageView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage* blendedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[subView release];
[imageView release];

[self doWhateverIWantWith: blendedImage];
19
ответ дан 27 November 2019 в 19:44
поделиться

Не могли бы вы подробно объяснить, что вы имеете в виду под «похоже, не работает? " Он рисует только одно изображение или другое изображение? Рисовать черным? Шум? Сбой? Почему вы выбрали kCGBlendModeSourceIn ; какого эффекта вы пытаетесь достичь (есть десятки способов смешать изображения)? У какого-либо из ваших изображений уже есть альфа-канал?

Я предполагаю, что вы пытаетесь смешать два изображения так, чтобы у каждого было 50% непрозрачности? Используйте для этого CGContextSetAlpha () вместо CGContextSetBlendMode () .

1
ответ дан 27 November 2019 в 19:44
поделиться

Вы можете использовать drawInRect: или drawAtPoint: для UIImage вместо CGContextDrawImage (они рисуют в текущем контексте) . Их использование дает вам какую-либо разницу в выводе?

Также может быть полезно убедиться, что значения UIImage * , которые вы получаете обратно из imageNamed: , действительны.

0
ответ дан 27 November 2019 в 19:44
поделиться

Это то, что я сделал в своем приложении, аналогично приложению Тайлера, но без UIImageView :

UIImage *bottomImage = [UIImage imageNamed:@"bottom.png"];
UIImage *image = [UIImage imageNamed:@"top.png"];

CGSize newSize = CGSizeMake(width, height);
UIGraphicsBeginImageContext( newSize );

// Use existing opacity as is
[bottomImage drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
// Apply supplied opacity
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height) blendMode:kCGBlendModeNormal alpha:0.8];

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

Если изображение уже имеет непрозрачность, вам не нужно ее устанавливать (как в bottomImage ), в противном случае вы можете установить ее (как с image ).

89
ответ дан 27 November 2019 в 19:44
поделиться

Blending with alpha

UIGraphicsBeginImageContext(area.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextRetain(context);

// mirroring context
CGContextTranslateCTM(context, 0.0, area.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

for (...) {
    CGContextBeginTransparencyLayer(context, nil);
    CGContextSetAlpha( context, alpha );
    CGContextDrawImage(context, area, tempimg.CGImage);
    CGContextEndTransparencyLayer(context);
}

// get created image
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
CGContextRelease(context);
UIGraphicsEndImageContext();
4
ответ дан 27 November 2019 в 19:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: