iOS原生、Android 原生, flutter 三种方式给照片流添加文字(水印)

news2024/11/16 18:03:23

效果图:三中代码实现的效果差不多

Swift:代码

import UIKit

class ImageWatermarking: NSObject {
    
    static func textToImage(drawText text: String, inImage initImage: UIImage, atPoint point: CGPoint) -> UIImage {
        let textColor = UIColor.white
        let textFont = UIFont(name:"Helvetica", size: 26)!

        
        // 新建底部拼接区域
        let rect: CGRect = CGRect(x: 0, y: 0, width: initImage.size.width, height: 220)
        UIGraphicsBeginImageContext(rect.size)
        let context: CGContext = UIGraphicsGetCurrentContext()!
        context.setFillColor(UIColor.kHexRGBA(0x000000,0.3).cgColor)
        context.fill(rect)
        let imagebottom = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsGetCurrentContext()
        

        let style = NSMutableParagraphStyle()
        style.lineSpacing = 6
        style.lineBreakMode = NSLineBreakMode.byTruncatingTail
        // 在底部拼接区域添加文字
        let textFontAttributes = [
            NSAttributedString.Key.font: textFont,
            NSAttributedString.Key.foregroundColor: textColor,
            NSAttributedString.Key.paragraphStyle: style
            
            ] as [NSAttributedString.Key : Any]
        imagebottom!.draw(in: CGRect(origin: CGPoint.zero, size: imagebottom!.size))
        let rectText = CGRect(origin: point, size: initImage.size)
        text.draw(in: rectText, withAttributes: textFontAttributes)
        let newTextImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        

        // 拼接原图和新建的底部区域
        let topImage = initImage
        let bottomImage = newTextImage
        
        let allSize = CGSize(width: topImage.size.width, height: topImage.size.height )
        UIGraphicsBeginImageContext(allSize)
        
        let areaSizeTop = CGRect(x: 0, y: 0, width: topImage.size.width, height: topImage.size.height)
        topImage.draw(in: areaSizeTop)

        let areaSizeBottom = CGRect(x: 0, y: areaSizeTop.size.height-220, width: bottomImage!.size.width, height: bottomImage!.size.height)
        bottomImage!.draw(in: areaSizeBottom)

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

    }


}

Swift 调用:

        
let contentStr :String =  currentTime &

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1113616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何选择一款好的护眼台灯?双十一必入护眼台灯推荐

随着科技的不断发展,工作时使用电子设备越来越普遍,如何保护我们的眼睛不受蓝光、频闪等危害就变得极其重要了。护眼台灯,顾名思义就是保护眼睛的台灯,其工作原理是在光源处使用特殊的防蓝光灯珠,并通过控制电流的稳定性来达到防频…

easyrecovery2024数据恢复软件最新版本下载

easyrecovery是PC上数据恢复领域相当给力的应用软件之一,它具有操作安全,价格便宜,支持用户自主操作等特点,能支持从各种存储介质恢复删除、格式化或者丢失的文件,从任何存储介质设备上的损坏,删除&#xf…

最简网卡驱动

在内核注册自定义的网卡驱动&#xff0c;并通过打印用户空间和内核的交互数据&#xff0c;可以更深层次的理解网络协议。 驱动代码&#xff1a; #include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h> #include <linux/netdevi…

每日一题 2525. 根据规则将箱子分类 (简单)

简单题&#xff0c;直接分类就好 class Solution:def categorizeBox(self, length: int, width: int, height: int, mass: int) -> str:if length > 10**4 or width > 10**4 or height > 10**4 or length*width*height > 10**9:return "Both" if mas…

短链服务如何定制域名

短链接不仅方便推广&#xff0c;而且还能能够保护原来的落地域名&#xff0c;为落地域名提供一个屏障&#xff0c;那么短链接的自定义域名怎么绑定呢&#xff1f;接下来就为大家带来详细的绑定步骤&#xff0c;需要的伙伴可以来看看。 域名绑定步骤 首先您或您的公司团队需要拥…

易点易动:一周完成数万件固定资产管理盘点的解决方案

在现代商业环境中&#xff0c;固定资产管理盘点是企业不可或缺的重要环节。然而&#xff0c;传统的手工盘点方法往往效率低下、耗时费力&#xff0c;且容易出现错误。为了解决这一难题&#xff0c;易点易动固定资产管理系统提供了一种高效、准确的解决方案&#xff0c;使企业能…

【代码随想录】算法训练营 第六天 第三章 哈希表 Part 1

目录 哈希表理论基础 242. 有效的字母异位词 题目 思路 代码 349. 两个数组的交集 题目 思路 代码 202. 快乐数 题目 思路 代码 1. 两数之和 题目 思路 代码 无序集合解法 map解法 哈希表理论基础 哈希表就是之前在数据结构中学过的散列表&#xff0c;通过哈…

2023年中国工业气体行业研究报告

第一章 行业概况 1.1 定义 工业气体行业是一个不可或缺的产业领域&#xff0c;它为多种行业提供关键的产品和服务。工业气体&#xff0c;包括氧气、氮气、氩气、二氧化碳、氦气、氢气及特种气体等&#xff0c;是现代工业生产和科学研究的基础。这些气体在不同的领域具有广泛的…

配置PPPoE拨号双链路上行备份示例

组网图形 图1 设备作为PPPoE Client双链路上行备份组网图 组网需求配置思路操作步骤配置文件 组网需求 如图1所示&#xff0c;设备下行通过GE1/0/0连接局域网用户&#xff0c;上行通过GE2/0/0接入PPPoE Server1作为主链路&#xff0c;通过GE3/0/0接入PPPoE Server2作为备份…

网站管家机器人在为企业获客方面起什么作用?

随着科技的不断进步和人们对便捷服务的需求增加&#xff0c;网站管家机器人成为了现代企业获客的重要工具。作为一种基于人工智能技术的在线助手&#xff0c;网站管家机器人可以与访问企业网站的用户进行智能对话&#xff0c;并提供即时的帮助和解答。 网站管家机器人在为企业获…

图吧工具箱2023,供大家学习研究参考!

1.修复Thaiphoon异常关闭的问题。 2.修复<下载皮肤编辑器>无效的问题。 3.移除OCCT。 4.添加Steam官方下载页的快捷方式。 5.移除老旧的兼容模式。 下载&#xff1a;https://download.csdn.net/download/weixin_43097956/88449046

Si24R2|2.4G单发射芯片 +7dBm可调功率 校讯通

Si24R2是一种通用、低功耗、高性能的2.4GHz无线射频发射芯片&#xff0c;主要用于单向通信系统&#xff0c;以降低系统成B&#xff0c;在运行中与si24r1兼容。 Si24r2具有低功耗和低成B。 它主要用于单向低功率传输系统&#xff0c;如无线控制系统、无线数据采集系统等。 Si2…

8.对象贴地

愿你出走半生,归来仍是少年&#xff01; 在场景中&#xff0c;有时候需要对地物&#xff08;房屋、楼宇&#xff09;进行贴地处理&#xff0c;或者说相对地面高度&#xff08;井盖、井室&#xff09;进行设置。 通过自定义的Terrain切片以及影像瓦片构建的三维场景应该如何获取…

Optuna:带仪表盘的可视化的超参数优化

1、引言 Optuna是一个由日本东京大学开发的自动化超参数优化库&#xff0c;用于机器学习和人工智能。它可用于自动优化神经网络、随机森林等模型的超参数&#xff0c;以改善模型的性能和准确性。Optuna还可以与其他流行的机器学习框架&#xff08;如TensorFlow和PyTorch&#…

企业数据泄密的场景有哪些?怎样斩断员工泄密风险?

企业数据泄露事件频频发生、屡禁不止&#xff0c;根据美国威瑞森通信公司&#xff08;Verizon&#xff09;《2023 Data Breach Investigations Report》&#xff0c;由外部攻击导致的数据泄露事件中&#xff0c;95%的外部攻击是以金钱利益为驱使的。同样&#xff0c;闪捷发布的…

开发者视角下的直播实时美颜SDK:集成和自定义的方法

在今天的数字时代&#xff0c;视频直播已经成为了一种强大的社交工具和娱乐方式。为了让直播内容更吸引人&#xff0c;实时美颜技术已经成为直播应用的重要组成部分。本文将从开发者的角度探讨如何集成和自定义直播实时美颜SDK&#xff0c;以满足用户的美颜需求。 一、什么是直…

算法通关村-----归并排序

基本原理 归并排序采用分治的思想&#xff0c;即分而治之&#xff0c;分就是将一个大问题分成一些小问题求解&#xff0c;治就是将分得的小问题得到的答案和在一起&#xff0c;得到最终的结果。体现在归并排序上&#xff0c;就是将大的数组分成小的序列&#xff0c;一直分到每…

Android问题笔记 - 关于SuperNotCalledException报错异常信息的解决方案

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

解决win10远程桌面连接出现的“身份验证错误,要求的函数不支持”问题

用win10远程左面连接window服务器&#xff0c;出现上面问题。出现身份验证错误&#xff0c;要求的函数不支持。可以使用以下方法来解决&#xff1a; 1、winr键&#xff1a;输入gpedit.msc&#xff0c;然后回车 选择计算机配置>管理模板>系统>凭据分配>加密Oracle/…