8

I want to merge multiple images which are of different size & at different points.
I want to merge them all and save it in one copy(image).

so how can i mearge images into one image?

Haresh Ghatala
  • 1,996
  • 17
  • 25
  • Please have a look at this:- http://stackoverflow.com/questions/9208951/ios-merging-two-images-of-different-size and http://stackoverflow.com/questions/18273271/merge-two-image-on-to-one-image-programmatically-in-iphone – Piyush Dubey Jan 02 '14 at 07:09

3 Answers3

6

I found the solution which is so simple

you can merge multiple images by creating following method

- (BOOL) mergedImageOnMainImage:(UIImage *)mainImg WithImageArray:(NSArray *)imgArray AndImagePointArray:(NSArray *)imgPointArray
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    UIGraphicsBeginImageContext(mainImg.size);

    [mainImg drawInRect:CGRectMake(0, 0, mainImg.size.width, mainImg.size.height)];
    int i = 0;
    for (UIImage *img in imgArray) {
        [img drawInRect:CGRectMake([[imgPointArray objectAtIndex:i] floatValue],
                                   [[imgPointArray objectAtIndex:i+1] floatValue],
                                   img.size.width,
                                   img.size.height)];

        i+=2;
    }

    CGImageRef NewMergeImg = CGImageCreateWithImageInRect(UIGraphicsGetImageFromCurrentImageContext().CGImage,
                                                          CGRectMake(0, 0, mainImg.size.width, mainImg.size.height));

    UIGraphicsEndImageContext();
    [pool release];

    if (NewMergeImg == nil) {
        return NO;
    }
    else {
        UIImageWriteToSavedPhotosAlbum([UIImage imageWithCGImage:NewMergeImg], self, nil, nil);
        return YES;
    }
}

now call this method in follwing way

NSArray *imgArray = [[NSArray alloc] initWithObjects:
                         [UIImage imageNamed:@"image06.png"],
                         [UIImage imageNamed:@"image07.png"],
                         [UIImage imageNamed:@"image08.png"],
                         [UIImage imageNamed:@"image09.png"],
                         [UIImage imageNamed:@"BackBtn.png"],
                         [UIImage imageNamed:@"Facebook.png"], nil];

NSArray *imgPointArray = [[NSArray alloc] initWithObjects:
                          @"10", @"10",
                          @"10", @"25",
                          @"30", @"15",
                          @"30", @"50",
                          @"20", @"80",
                          @"25", @"100", nil];


BOOL suc = [self mergedImageOnMainImage:[UIImage imageNamed:@"img001.png"] WithImageArray:imgArray AndImagePointArray:imgPointArray];

if (suc == YES) {
    NSLog(@"Images Successfully Mearged & Saved to Album");
}
else {
    NSLog(@"Images not Mearged & not Saved to Album");
}
Haresh Ghatala
  • 1,996
  • 17
  • 25
  • What does the imgPointArray refer to? Is that the "upper left" x,y coordinate of what you want to extract from the image to add to the main image? – Praxiteles Jun 09 '15 at 20:38
  • @Praxiteles It is the point where you want to place your array images above the Main image. i.e. it is for position of your array images – Haresh Ghatala Jun 25 '15 at 06:46
1

You can use CIImage for this,

-(UIImage *)mergeTwoImage:(UIImage*)image1 andImage2:(UIImage *)image2
{

    CIImage *topImage = [[CIImage alloc]initWithImage:image1];
    CIImage *backgroundImage = [[CIImage alloc]initWithImage:image2];
    CIFilter *darkenFilter = [CIFilter filterWithName:@"CIDarkenBlendMode" keysAndValues:kCIInputImageKey,topImage,
                          @"inputBackgroundImage",backgroundImage,nil];

    CIImage *resultOfFilter = darkenFilter.outputImage;

    CIContext *ctx = [CIContext contextWithOptions:nil];
    CGImageRef imageToReturn = [ctx createCGImage:resultOfFilter fromRect:resultOfFilter.extent];

    UIImage *outputImage = [UIImage imageWithCGImage:imageToReturn];
    CGImageRelease(imageToReturn);
    imageToReturn = nil;

    return outputImage;
}
Shaik Riyaz
  • 11,204
  • 7
  • 53
  • 70
0

You can use this code : -

    - (IBAction) mergeImage:(id)sender
{
            UIImage *framedImage = firstImageView.image;

            CGSize size = CGSizeMake(firstImageView.frame.size.width, firstImageView.frame.size.height);

            UIGraphicsBeginImageContextWithOptions(size, self.view.alpha, 0.0);

            UIImage *imageToPlace = secondImageView.image;

            [framedImage drawInRect:CGRectMake(0, 0, firstImageView.frame.size.width, firstImageView.frame.size.height)];

            [imageToPlace drawInRect:CGRectMake(18, 25, 242, 243)]; 

            UIImage *imageC = UIGraphicsGetImageFromCurrentImageContext();

            UIGraphicsEndImageContext();

            UIImageView *newImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, framedImage.size.width,framedImage.size.height)];

            newImageView.image = imageC;

            newImageView.contentMode = UIViewContentModeScaleAspectFill;
}

This is for 2 images they merge two UIImageViews into one. Same this for multiple images. You have to merge multiple images according to your size.

Gurpreet
  • 181
  • 6