2013-04-11 2 views
1

Я нашел приведенный ниже код для слияния двух изображений, если у кого-то есть другой код, слияние этих двух изображений в одно изображение.Слияние Два uiimageview в один одиночный uiimageview в iOS

Когда я объединить два UIImageView в один UIImageView, то финальное изображение становится черным или белым оттенком .. фактический цвет маскирования изображения не приходит в конечном изображении enter image description here enter image description here enter image description here

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
    self.navigationController.navigationBarHidden = YES; 
    imgBack = [UIImage imageNamed:@"img1.jpg"]; 
    imgMask = [UIImage imageNamed:@"img2.png"]; 
    imgBackground.image = imgBack; 
    imgMasking.image = imgMask; 

    imgFinally = [self maskImage:imgBack withMask:imgMask]; 
    imgFinal.image = imgFinally; 

    imgBackground.image= nil; 
    imgMasking.image = nil; 
} 

- (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]; 
} 
+2

Разум, размещающий некоторые соответствующие изображения? Некоторые из нас могут быть в офисе. – viral

+0

см. Мой ответ ... http://stackoverflow.com/questions/14049796/howe-to-capture-uiview-top-uiview/14049828#14049862 просто захватите это представление и сохраните в своей библиотеке –

+0

@kagmanoj вы попробуете мой ответ?? –

ответ

0

Разработчик документация состояний что:

A маска. Если маска является изображением, она должна находиться в пространстве памяти DeviceGray , не должна иметь альфа-компонента и сама не может быть замаскирована маской изображения или цветом маскировки. Если маска не совпадает с размером в качестве изображения, заданного параметром изображения, то Quartz масштабирует маску для соответствия изображению.

В отличие от этого, например, Photoshop, CoreGraphics не позволяет маскировать альфа-каналы, но, скорее, в оттенках серого. Вы удостоверились, что ваша маска имеет оттенки серого?

2

Привет попробовать это ....

UIImage* bottomImage = [UIImage imageNamed:@"index.jpg"]; 
    UIImage* topImage = [UIImage imageNamed:@"tiger.png"]; 
    UIImageView* imageView = [[UIImageView alloc] initWithImage:bottomImage]; 
    UIImageView* subView = [[UIImageView alloc] initWithImage:topImage]; 
    [imageView addSubview:subView]; 
    UIGraphicsBeginImageContext(imageView.frame.size); 
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeMultiply); 
    [imageView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage* blendedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    [subView release]; 
    [imageView release]; 
    self.resultImage.image=blendedImage; //Your Image set 

Конечный модифицированный метод для выпуска: -

- (UIImage*) mergeTwoImages : (UIImage*) topImage : (UIImage*) bottomImage 
{ 
    // URL REF: http://iphoneincubator.com/blog/windows-views/image-processing-tricks 
    // URL REF: http://stackoverflow.com/questions/1309757/blend-two-uiimages?answertab=active#tab-top 
    // URL REF: http://www.waterworld.com.hk/en/blog/uigraphicsbeginimagecontext-and-retina-display 

    int width = bottomImage.size.width; 
    int height = bottomImage.size.height; 

    CGSize newSize = CGSizeMake(width, height); 
    static CGFloat scale = -1.0; 

    if (scale<0.0) 
    { 
     UIScreen *screen = [UIScreen mainScreen]; 

     if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) 
     { 
      scale = [screen scale]; 
     } 
     else 
     { 
      scale = 0.0; // Use the standard API 
     } 
    } 

    if (scale>0.0) 
    { 
     UIGraphicsBeginImageContextWithOptions(newSize, NO, scale); 
    } 
    else 
    { 
     UIGraphicsBeginImageContext(newSize); 
    } 

    [bottomImage drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; 
// [topImage drawInRect:CGRectMake(0,0,newSize.width,newSize.height) blendMode:kCGBlendModeLighten alpha:1.0]; 
    [topImage drawInRect:CGRectMake(0,0,newSize.width,newSize.height) blendMode:kCGBlendModeMultiply alpha:1.0]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return newImage; 
} 

Я надеюсь, что этот метод позволит решить проблему ....

+0

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

+0

привет, это работа, но нижнее изображение не отображается, и если оно сливается, тогда цвет слияния будет изменено, что является моей проблемой – kagmanoj

6

Поместите все изображения в один вид и вызовите этот метод, он объединяет все изображения и дает новое изображение.

+0

Что вы подразумеваете под словом «Все изображения в одном представлении». Добавляем ли мы UIImageView для просмотра в виде подзонов? –

+0

Да, вы должны поместить свое изображение в UIView и вызвать этот метод для создания изображения. – yen

0

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

Смежные вопросы