2012-02-13 98 views
28

想知道該保存2張圖片爲1張圖片。如何合併/合併2張圖片爲1

照片的一個被允許移動,旋轉和放大/縮小...

我這樣做,但它基本上捕獲所有的東西在屏幕上,包括我的按鈕...

UIGraphicsBeginImageContext(self.view.bounds.size); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *savedImg = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+0

檢查此鏈接:-http://stackoverflow.com/questions/6690444/merging-two-uiimage-into-1-to -be-savedtolibrary – Leena 2012-02-13 09:22:06

+3

你鏈接的線程...不是非常有用: – Vlad 2012-02-13 09:30:48

+0

檢查http://stackoverflow.com/questions/9208951/ios-merging-two-images-of-different-size/9209044#9209044 – 2012-02-14 06:15:34

回答

11
  1. crate子視圖添加圖像。
  2. 在該視圖中添加所有圖像而不是主視圖。
  3. 讓按鈕和其他東西留在主視圖上。
  4. 只渲染位圖上下文中的圖像而不是像您現在正在執行的主視圖。
+1

謝謝,我想這是最好的方法:) – Desmond 2012-02-14 08:31:35

60

您可以創建圖形上下文並在其中繪製兩個圖像。您將從組合的源圖像中獲得圖像結果。

- (UIImage*)imageByCombiningImage:(UIImage*)firstImage withImage:(UIImage*)secondImage { 
    UIImage *image = nil; 

    CGSize newImageSize = CGSizeMake(MAX(firstImage.size.width, secondImage.size.width), MAX(firstImage.size.height, secondImage.size.height)); 
    if (UIGraphicsBeginImageContextWithOptions != NULL) { 
     UIGraphicsBeginImageContextWithOptions(newImageSize, NO, [[UIScreen mainScreen] scale]); 
    } else { 
     UIGraphicsBeginImageContext(newImageSize); 
    } 
    [firstImage drawAtPoint:CGPointMake(roundf((newImageSize.width-firstImage.size.width)/2), 
             roundf((newImageSize.height-firstImage.size.height)/2))]; 
    [secondImage drawAtPoint:CGPointMake(roundf((newImageSize.width-secondImage.size.width)/2), 
             roundf((newImageSize.height-secondImage.size.height)/2))]; 
    image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 
+0

嗨弗拉德,感謝您的代碼。它可以工作,但不會保存我編輯過的任何移動或旋轉。它也保存在圖片的高寬比中。任何建議? – Desmond 2012-02-14 01:33:17

+0

嗨弗拉德,謝謝 – Desmond 2012-02-14 08:31:46

+0

很高興它的作品。不知道你在做什麼?在你編輯運行時的圖像?或者只是縮放,移動和旋轉? – Vlad 2012-02-15 16:43:46

9

您可以使用此方法,這是非常動態的,你可以指定第二圖像和圖像的總規模的起始位置。

-(UIImage *) addImageToImage:(UIImage *)img withImage2:(UIImage *)img2 andRect:(CGRect)cropRect withImageWidth:(int) width  
{ 

    CGSize size = CGSizeMake(width,40); 
    UIGraphicsBeginImageContext(size); 

    CGPoint pointImg1 = CGPointMake(0,0); 
    [img drawAtPoint:pointImg1]; 

    CGPoint pointImg2 = cropRect.origin; 
    [img2 drawAtPoint: pointImg2]; 

    UIImage* result = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return result; 
} 
37

// Objective-C的

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

CGSize size = CGSizeMake(image1.size.width, image1.size.height + image2.size.height); 

UIGraphicsBeginImageContext(size); 

[image1 drawInRect:CGRectMake(0,0,size.width, image1.size.height)]; 
[image2 drawInRect:CGRectMake(0,image1.size.height,size.width, image2.size.height)]; 

UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

//set finalImage to IBOulet UIImageView 
imageView.image = finalImage; 

//夫特

let topImage = UIImage(named: "image1.png") 
let bottomImage = UIImage(named: "image2.png") 

let size = CGSizeMake(topImage!.size.width, topImage!.size.height + bottomImage!.size.height) 
UIGraphicsBeginImageContextWithOptions(size, false, 0.0) 

[topImage!.drawInRect(CGRectMake(0,0,size.width, topImage!.size.height))]; 
[bottomImage!.drawInRect(CGRectMake(0,topImage!.size.height,size.width, bottomImage!.size.height))]; 

let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 

//set finalImage to IBOulet UIImageView 
mergeImage.image = newImage 
2

下面是UIImage的擴展到多個圖像組合的方法:

class func combine(images: UIImage...) -> UIImage { 
    var contextSize = CGSizeZero 

    for image in images { 
     contextSize.width = max(contextSize.width, image.size.width) 
     contextSize.height = max(contextSize.height, image.size.height) 
    } 

    UIGraphicsBeginImageContextWithOptions(contextSize, false, UIScreen.mainScreen().scale) 

    for image in images { 
     let originX = (contextSize.width - image.size.width)/2 
     let originY = (contextSize.height - image.size.height)/2 

     image.drawInRect(CGRectMake(originX, originY, image.size.width, image.size.height)) 
    } 

    let combinedImage = UIGraphicsGetImageFromCurrentImageContext() 

    UIGraphicsEndImageContext() 

    return combinedImage 
} 

實施例:

UIImage.combine(image1, image2) 
7

夫特3

在這個例子中frontImage正在繪製使用insetBy 20%的餘量的其它圖像的內部。

必須在前面繪製背景圖像,然後依次繪製前面的圖像。

我用這個視頻幀圖像放置一個 「播放」 圖標圖像中前一個UIImageView內象下面這樣:

enter image description here

用法:

self.image = self.mergedImageWith(frontImage: UIImage.init(named: "play.png"), backgroundImage: UIImage.init(named: "backgroundImage.png"))) 

方法:

func mergedImageWith(frontImage:UIImage?, backgroundImage: UIImage?) -> UIImage{ 

    if (backgroundImage == nil) { 
     return frontImage! 
    } 

    let size = self.frame.size 
    UIGraphicsBeginImageContextWithOptions(size, false, 0.0) 

    backgroundImage?.draw(in: CGRect.init(x: 0, y: 0, width: size.width, height: size.height)) 
    frontImage?.draw(in: CGRect.init(x: 0, y: 0, width: size.width, height: size.height).insetBy(dx: size.width * 0.2, dy: size.height * 0.2)) 

    let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
    UIGraphicsEndImageContext() 

    return newImage 
} 
1

Swift-3(IOS10。3

extension UIImage { 
    func combineWith(image: UIImage) -> UIImage { 
     let size = CGSize(width: self.size.width, height: self.size.height + image.size.height) 
     UIGraphicsBeginImageContextWithOptions(size, false, 0.0) 

     self.draw(in: CGRect(x:0 , y: 0, width: size.width, height: self.size.height)) 
     image.draw(in: CGRect(x: 0, y: self.size.height, width: size.width, height: image.size.height)) 

     let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
     UIGraphicsEndImageContext() 

     return newImage 
    } 
} 

使用

let image1 = UIImage(named: "image1.jpg") 
let image2 = UIImage(named: "image2.jpg") 

yourImageView.image = image1?.combineWith(image: image2)