2016-04-08 14 views
0

Ich versuche, zwei Bilder in das endgültige Bild zusammenführen, aber leider kann ich nicht finden, wie dies zu tun ist. Wie kann ich zwei Fotos wie unten gezeigt zusammenführen?Mischen Sie zwei Bilder zusammen

enter image description here

enter image description here

enter image description here

+1

Diese Anleitung kann helfen https://www.raywenderlich.com/69855/image-processing-in-ios-part-1-raw-bitmap-Änderung –

+0

Wie wäre es mit Photoshop? –

Antwort

2
UIImage *image1 = [UIImage imageNamed:@"image1.jpg"]; 
UIImage *image2 = [UIImage imageNamed:@"image2.jpg"]; 

CGSize newSize = image1.size; //set new size as you want 
UIGraphicsBeginImageContext(newSize); 

//crop image1 
CGImageRef imageRef = CGImageCreateWithImageInRect([image1 CGImage], CGRectMake(0, 0, image1.size.width/2, image1.size.height)); 
image1 = [UIImage imageWithCGImage:imageRef scale:image1.scale orientation:image1.imageOrientation]; 
CGImageRelease(imageRef); 


//crop image2 
imageRef = CGImageCreateWithImageInRect([image2 CGImage], CGRectMake(0, 0, image2.size.width/2, image2.size.height)); 
image2 = [UIImage imageWithCGImage:imageRef scale:image2.scale orientation:image2.imageOrientation]; 
CGImageRelease(imageRef); 

//combine both images 
// Use existing opacity as is 
[image1 drawInRect:CGRectMake(0, 0, newSize.width/2, newSize.height)]; 

// Apply supplied opacity if applicable 
[image2 drawInRect:CGRectMake(newSize.width/2, 0, newSize.width/2, newSize.height) blendMode:kCGBlendModeNormal alpha:1]; 

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

NSString *strPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true) objectAtIndex:0]; 
strPath = [strPath stringByAppendingPathComponent:@"img.png"]; 
NSError *error = nil; 
[[NSFileManager defaultManager] removeItemAtPath:strPath error:&error]; 

NSData *imgdata = UIImagePNGRepresentation(newImage); 
[imgdata writeToFile:strPath atomically:false]; 
NSLog(@"Path = %@",strPath); //on this path image will be stored 
+0

Danke für die Hilfe @Richard G –

+0

Ihre Begrüßung :) –

+0

Dies macht natürlich nicht den Gradienten Übergang zwischen den beiden Bildern, sondern ist ein harter Übergang. – Rob

0
_View1.frame = CGRectMake(0, 0, Width/2, Width); 
_View2.frame = CGRectMake(0, 0, Width/2, Width); 

    CAGradientLayer *gradientMask = [CAGradientLayer layer]; 
    gradientMask.frame = self.View2.bounds; 
    gradientMask.colors = @[(id)[UIColor whiteColor].CGColor, 
          (id)[UIColor clearColor].CGColor]; 
    gradientMask.startPoint = CGPointMake(0.5, 0.5); // start at left middle 
    gradientMask.endPoint = CGPointMake(0, 0.5);  // end at right middle 
    self.View2.layer.mask = gradientMask; 

=>I got help from this answer.

2

Noch einfacher können Sie ein CISwipeTransition und setzen inputTime-,5, verwenden

Simon

+0

Wie kann ich mit CISwipeTransition machen? Hast du ein Beispiel? –

+0

Ein Swipe-Übergang akzeptiert zwei Bilder - 'inputImage' und' inputTargetImage'. Es ist in erster Linie für den Wechsel zwischen Bildern in Apps wie einer Diashow gedacht, aber durch Einstellen der 'inputTime' auf 0,5 wird eine geteilte Bildschirmansicht der beiden Bilder angezeigt. Ich spreche nicht ObjC, ich fürchte, aber ich habe eine Swift-Demo-App zur Erkundung von CI-Übergängen: https://github.com/FlexMonkey/CoreImageTransitionExplorer –

+0

Das stimmt. Aber ich muss nur den Farbverlauf zwischen den Bildern anpassen, ich brauche keinen Übergang. danach muss ich diese zwei Bilder in ein Bild zeichnen. –

1

Wenn Sie Core Graphics verwenden möchten, können Sie eine Verlaufsmaske erstellen, um das erste Bild zeichnen, die Steigung als Clipping-Maske anwenden und dann das zweite Bild zeichnen. Somit ist das erste Bild unclipped und die zweite auf den Gradienten abgeschnitten wird:

- (UIImage *)imageCombiningImage:(UIImage *)image1 withImage:(UIImage *)image2 { 
    CGRect rect = CGRectMake(0, 0, image1.size.width, image1.size.height); 

    UIGraphicsBeginImageContextWithOptions(image1.size, TRUE, image1.scale); 

    // create gradient 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    CGFloat locations[] = { 0.45, 0.55 }; // gradient goes from 45% to 55% the way across the image 
    CGFloat components[] = { 
     1.0, 1.0, 1.0, 1.0,    // Start color ... white 
     0.0, 0.0, 0.0, 0.0     // End color ... clear 
    }; 

    CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, components, locations, 2); 

    // create mask from that gradient 

    CGContextRef context = UIGraphicsGetCurrentContext();   
    CGContextDrawLinearGradient(context, gradient, CGPointMake(0, 0), CGPointMake(image1.size.width, 0), kCGGradientDrawsAfterEndLocation); 
    CGImageRef gradientImageRef = CGBitmapContextCreateImage(context); 

    // draw the first image 

    [image1 drawInRect:rect]; 

    // clip subsequent drawing to the gradient mask we just created 

    CGContextClipToMask(context, rect, gradientImageRef); 

    // draw the second image 

    [image2 drawInRect:rect]; 

    // extract the image 

    UIImage *combinedImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    // clean up 

    CGColorSpaceRelease(colorSpace); 
    CGGradientRelease(gradient); 
    CGImageRelease(gradientImageRef); 

    return combinedImage; 
} 

Das ergibt:

enter image description here

Verwandte Themen