Ios 如何合并两个图像?
我正在尝试合并两个不同的图像并创建一个新的。我想这样做: 我有这张图(A): 这是一张PNG图片,我想将这张图片与另一张图片(B)合并,这张图片是我从手机上获取的,可以创建如下内容: 我需要一个函数谁合并与B创建C。大小必须保持从a图像和图像B应自动调整大小,以适应宝丽来(a)。有可能吗?谢谢你的帮助 更新Ios 如何合并两个图像?,ios,swift,uiimage,core-graphics,Ios,Swift,Uiimage,Core Graphics,我正在尝试合并两个不同的图像并创建一个新的。我想这样做: 我有这张图(A): 这是一张PNG图片,我想将这张图片与另一张图片(B)合并,这张图片是我从手机上获取的,可以创建如下内容: 我需要一个函数谁合并与B创建C。大小必须保持从a图像和图像B应自动调整大小,以适应宝丽来(a)。有可能吗?谢谢你的帮助 更新 只有一件事,图像(A)是一个正方形,而我拍摄的图像是16:9,我如何修复它??如果我使用你的函数,我拍摄的图像(B)将被拉伸 希望这对您有所帮助 var bottomImage = UII
只有一件事,图像(A)是一个正方形,而我拍摄的图像是16:9,我如何修复它??如果我使用你的函数,我拍摄的图像(B)将被拉伸 希望这对您有所帮助
var bottomImage = UIImage(named: "bottom.png")
var topImage = UIImage(named: "top.png")
var size = CGSize(width: 300, height: 300)
UIGraphicsBeginImageContext(size)
let areaSize = CGRect(x: 0, y: 0, width: size.width, height: size.height)
bottomImage!.draw(in: areaSize)
topImage!.draw(in: areaSize, blendMode: .normal, alpha: 0.8)
var newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
最好的是:)这样覆盖图片会更干净
class func mergeImages(imageView: UIImageView) -> UIImage {
UIGraphicsBeginImageContextWithOptions(imageView.frame.size, false, 0.0)
imageView.superview!.layer.renderInContext(UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
此解决方案的Objective C版本,具有顶级图像重新居中逻辑:
-(UIImage *)getImageInclosedWithinAnotherImage
{
float innerImageSize = 20;
UIImage *finalImage;
UIImage *outerImage = [UIImage imageNamed:@"OuterImage.png"];
UIImage *innerImage = [UIImage imageNamed:@"InnerImage.png"];
CGSize outerImageSize = CGSizeMake(40, 40); // Provide custom size or size of your actual image
UIGraphicsBeginImageContext(outerImageSize);
//calculate areaSize for re-centered inner image
CGRect areSize = CGRectMake(((outerImageSize.width/2) - (innerImageSize/2)), ((outerImageSize.width/2) - (innerImageSize/2)), innerImageSize, innerImageSize);
[outerImage drawInRect:CGRectMake(0, 0, outerImageSize.width, outerImageSize.height)];
[innerImage drawInRect:areSize blendMode:kCGBlendModeNormal alpha:1.0];
finalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return finalImage;
}
Swift 4
UIImage
扩展,支持轻松的图像合并/叠加
extension UIImage {
func overlayWith(image: UIImage, posX: CGFloat, posY: CGFloat) -> UIImage {
let newWidth = size.width < posX + image.size.width ? posX + image.size.width : size.width
let newHeight = size.height < posY + image.size.height ? posY + image.size.height : size.height
let newSize = CGSize(width: newWidth, height: newHeight)
UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
draw(in: CGRect(origin: CGPoint.zero, size: size))
image.draw(in: CGRect(origin: CGPoint(x: posX, y: posY), size: image.size))
let newImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return newImage
}
}
扩展UIImage{
func覆盖(image:UIImage,posX:CGFloat,posY:CGFloat)->UIImage{
设newWidth=size.width
向上投票的答案拉伸背景图像,改变其比例。下面的解决方案通过从包含两个图像视图作为子视图的UIView渲染图像来修复此问题
您正在寻找的答案(Swift 4):
func blendImages(_ img: UIImage,_ imgTwo: UIImage) -> Data? {
let bottomImage = img
let topImage = imgTwo
let imgView = UIImageView(frame: CGRect(x: 0, y: 0, width: 306, height: 306))
let imgView2 = UIImageView(frame: CGRect(x: 0, y: 0, width: 306, height: 306))
// - Set Content mode to what you desire
imgView.contentMode = .scaleAspectFill
imgView2.contentMode = .scaleAspectFit
// - Set Images
imgView.image = bottomImage
imgView2.image = topImage
// - Create UIView
let contentView = UIView(frame: CGRect(x: 0, y: 0, width: 306, height: 306))
contentView.addSubview(imgView)
contentView.addSubview(imgView2)
// - Set Size
let size = CGSize(width: 306, height: 306)
// - Where the magic happens
UIGraphicsBeginImageContextWithOptions(size, true, 0)
contentView.drawHierarchy(in: contentView.bounds, afterScreenUpdates: true)
guard let i = UIGraphicsGetImageFromCurrentImageContext(),
let data = UIImageJPEGRepresentation(i, 1.0)
else {return nil}
UIGraphicsEndImageContext()
return data
}
返回的图像数据使图像的大小加倍,因此将视图的大小设置为所需大小的一半
- 示例:我希望图像的宽度和高度为612,因此我将图幅宽度和高度设置为306) //享受:)
extension UIImage {
func overlayWith(image: UIImage, posX: CGFloat, posY: CGFloat) -> UIImage {
let newWidth = posX < 0 ? abs(posX) + max(self.size.width, image.size.width) :
size.width < posX + image.size.width ? posX + image.size.width : size.width
let newHeight = posY < 0 ? abs(posY) + max(size.height, image.size.height) :
size.height < posY + image.size.height ? posY + image.size.height : size.height
let newSize = CGSize(width: newWidth, height: newHeight)
UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
let originalPoint = CGPoint(x: posX < 0 ? abs(posX) : 0, y: posY < 0 ? abs(posY) : 0)
self.draw(in: CGRect(origin: originalPoint, size: self.size))
let overLayPoint = CGPoint(x: posX < 0 ? 0 : posX, y: posY < 0 ? 0 : posY)
image.draw(in: CGRect(origin: overLayPoint, size: image.size))
let newImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return newImage
}
}
扩展UIImage{
func覆盖(image:UIImage,posX:CGFloat,posY:CGFloat)->UIImage{
设newWidth=posX<0?abs(posX)+max(self.size.width,image.size.width):
size.widthSwift 5:UIImage的扩展
extension UIImage {
func mergeWith(topImage: UIImage) -> UIImage {
let bottomImage = self
UIGraphicsBeginImageContext(size)
let areaSize = CGRect(x: 0, y: 0, width: bottomImage.size.width, height: bottomImage.size.height)
bottomImage.draw(in: areaSize)
topImage.draw(in: areaSize, blendMode: .normal, alpha: 1.0)
let mergedImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return mergedImage
}
}
能否尝试将alpha值更改为1.0或0.1。。我不确定该值您可以使用不同版本的drawInRect
,它没有将混合选项作为参数,即topImage!。drawInRect(CGRectMake(xPosition,yPosition,topImage!.size.width,topImage!.size.height))
只有一件事,图像(A)是正方形,而我拍摄的图像是16:9,我如何修复它??如果我使用你的函数,我拍摄的图像(B)将被拉伸!我使用它生成了新图像的base64字符串。并由此产生一个空白图像。我查过了。该图像将生成一个空白的白色图像。我想做的是合并两个相互平行的图像。有人能帮我一下吗?谁否决了我的答案,你能不能花点时间补充一下你的意见,解释一下为什么否决了我的答案,这样我就能知道我的答案出了什么问题。@luca alberto,这是你的解决方案!!谢谢,这是一个很好的一个,但它不能正确处理负posX或posY。问题:当UIImageView
有Frame(10,10,宽度,高度)
解决方案:将UIImageView
添加到视图中,使其成为框架(0,0,宽度,高度)
并固定顶部和底部的空白。