如何合并/合并2个图像到1

想知道谁将2张图片保存为1张图片。

其中一张照片是允许移动,旋转和放大/缩小…

我正在这样做,但它基本上捕捉屏幕上的所有东西,包括我的button…

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

  1. 创build子视图添加图像。
  2. 在该视图中添加所有图像而不是主视图。
  3. 让button和其他东西留在主视图上。
  4. 只渲染位图上下文中的图像,而不是现在正在处理的主视图。

您可以创buildgraphics上下文并在其中绘制两个图像。 您将从两个源图像合并得到一个图像结果。

 - (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; } 

// 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; 

// Swift

 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 

您可以使用这种非常dynamic的方法,您可以指定第二个图像的起始位置和图像的总大小。

 -(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; } 

Swift 3

在这个例子中,frontImage使用20%margin的insetBy绘制在另一个图像的内部。

背景图像必须先前绘制,然后依次绘制前面的图像。

我使用这个在一个UIImageView里放置一个“Play”图标图像在一个video帧图像的前面,如下所示:

在这里输入图像说明

用法:

 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 } 

这里有一个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) 

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)