IPHONE,一个一个图像如何覆盖另一个图像以创建一个新图像以保存? (水印)

问题描述 投票:0回答:5

基本上,我想拍摄用户从其照片库中选择的图像,然后在右下方的三角形上应用一个带有应用程序名称的三角形。我有第二张图像已经在Photoshop中使用透明层制作。 我尝试了一个函数,我不记得确切的名称,但它涉及cgiimages和面具。这结合了这两个图像,但作为掩模,这使图像更暗透明层所在的位置,并且图像本身并不合并,只是被掩盖。

我如何将水印图像与另一个图像合并,以制作uiimage,而无需在屏幕上显示图像?

谢谢你

这很容易:

UIImage *backgroundImage = [UIImage imageNamed:@"image.png"]; UIImage *watermarkImage = [UIImage imageNamed:@"watermark.png"]; UIGraphicsBeginImageContext(backgroundImage.size); [backgroundImage drawInRect:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)]; [watermarkImage drawInRect:CGRectMake(backgroundImage.size.width - watermarkImage.size.width, backgroundImage.size.height - watermarkImage.size.height, watermarkImage.size.width, watermarkImage.size.height)]; UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();
iphone xcode uiimageview overlay watermark
5个回答
83
投票
如果您希望背景和水印的大小相同,然后使用此代码

... [backgroundImage drawInRect:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)]; [watermarkImage drawInRect:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)]; ...
    

omz
提供的解决方案也可以在

13
投票
中工作,就像这样:

let backgroundImage = UIImage(named: "image.png")! let watermarkImage = UIImage(named: "watermark.png")! UIGraphicsBeginImageContextWithOptions(backgroundImage.size, false, 0.0) backgroundImage.draw(in: CGRect(x: 0.0, y: 0.0, width: backgroundImage.size.width, height: backgroundImage.size.height)) watermarkImage.draw(in: CGRect(x: backgroundImage.size.width - watermarkImage.size.width, y: backgroundImage.size.height - watermarkImage.size.height, width: watermarkImage.size.width, height: watermarkImage.size.height)) let result = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() swift4

let backgroundImage = imageData!
let watermarkImage = #imageLiteral(resourceName: "jodi_url_icon")

UIGraphicsBeginImageContextWithOptions(backgroundImage.size, false, 0.0)
backgroundImage.draw(in: CGRect(x: 0.0, y: 0.0, width: backgroundImage.size.width, height: backgroundImage.size.height))
watermarkImage.draw(in: CGRect(x: 10, y: 10, width: watermarkImage.size.width, height: backgroundImage.size.height - 40))

let result = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.imgaeView.image = result

2
投票

您可以使用此方法,这是非常动态的,您可以指定第二张图像的起始位置和图像的总尺寸。 -(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; }

Swift5功能:

func addWaterMark(image: UIImage) -> UIImage { let backgroundImage = image//UIImage(named: "image.png") let watermarkImage = UIImage(named: "waterMark.png") UIGraphicsBeginImageContextWithOptions(backgroundImage.size, false, 0.0) backgroundImage.draw(in: CGRect(x: 0.0, y: 0.0, width: backgroundImage.size.width, height: backgroundImage.size.height)) watermarkImage!.draw(in: CGRect(x: backgroundImage.size.width - watermarkImage!.size.width, y: backgroundImage.size.height - watermarkImage!.size.height, width: watermarkImage!.size.width, height: watermarkImage!.size.height)) let result = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return result! }

1
投票

disclaimer:编程Swift/Xcode的两个月,所以请原谅我任何错误。
在这里,我还需要在一个多平台应用程序中应用一些水印。大多数示例都取决于“ AppKit”组件,我正在学习的是MacOS独有的(再次,我是新手);或者它们取决于“ Uikit”组件,显然是iOS独有的。另外,我在这里发现的最有用/功能最有用的建议使用了“ UigraphicsBeginimageContext”。当我练习(仅iOS)使用示例时,它们效果很好,但是一种特殊的UI方法被标记为“弃用”(至少在2024年底),所以我觉得我必须更远地浏览。
我的努力将我带到了核心,即“核心”。无论如何,我必须做的所有低级图形都迫使我进入核心成像和核心图形框架,那里的一切都很敏感,可选,有些棘手,并且可能与UI方向有所不同,但是我把它们效果很好,并确定我的工作很棒,我决定了我应该尝试分享,希望它可以帮助别人。有一些小的初步步骤将其他图像转换回CI/CG,这似乎是他们的基础,但这并不难,并且感觉到Uiimage和nsimage的本质。
如果您尚未到那时,您需要将“导入coreimage.cifilterbuiltins”添加到标准导入中。另外,在示例中,我有2个预制的覆盖层,其先验存储的透明α通道(“ watermarkciimage”和“ theclectiptipretciimage”)的大小与预期的(最简单的)相同(最简单)是相同的(背景)图像,而Func Lets则是输入布尔值选择要应用哪个(此选择功能是我的用途定制的,但是您可以将覆盖/水印图像而不是布尔值作为第二个输入,然后用“ let dummer.inputimage = myWaterMarkage = myWaterMarkageImage编辑代码”)。而且,在开发立即测试结果时,我还会打开和关闭一个“ if false {}”块。也可能对您有所帮助,因此将其留在这里:

1
投票

希望它有帮助


最新问题
© www.soinside.com 2019 - 2024. All rights reserved.