最新要闻
- 环球焦点!王思聪打人后行政拘留为什么能暂缓执行?罗翔科普
- 天天观速讯丨AMD悄悄公布31个CPU漏洞:4个极危险、Zen4高枕无忧
- 男子花32万买比亚迪海豹 内心崩溃:汽配城都没这么难看
- 焦点要闻:节能版酷睿i9-13900T现身:35W战平12900K
- 观天下!腾讯开出48人惩治名单 马化腾曾称内部贪腐“触目惊心”
- 【环球热闻】110度高烧不退!AMD RX 7900 XTX退换货率高达11%
- 为啥北方二十三过小年 南方却是二十四?和康熙乾隆有关
- 观察:无广告一年免费用!通信UOS家庭版22.0开始推送
- 男子买898元零食P图付款 被抓现行:实际支付了1分钱
- 天天通讯!基于传奇车型AE86!丰田推出两款新能源概念改装车
- 女子骑电动车载两人闯红灯被撞 被判全责 网友:这才是公正
- 苹果回应iPhone车祸监测误报频发:正收集相关反馈
- 《新·福音战士剧场版:终》国内海报抄袭!竹也文化官方布道歉声明
- 环球今热点:几十年数学难题被谷歌研究员意外突破 当年差点被导师赶出门
- B站2022百大UP主出炉:手工耿入选 走向世界的手工匠人
- 天天亮点!稳居春节档票房前三:《流浪地球2》官方揭秘太空电梯创作思路
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
环球快资讯:golang 为图片加水印
(资料图)
前段时间一个需求涉及到给图片加水印,考虑图片安全性,决定放在后端加水印。记录一下代码。
思路
思路是先为水印文字生成一个仅包含水印文字的图片,把这个图片倾斜一定角度 (一般水印都是倾斜的),之后把倾斜的水印文字图片贴在原图上,得到最终的水印图片。
代码
// watermark.gopackage mainimport ("image""image/color""image/draw""github.com/disintegration/imaging""github.com/golang/freetype""github.com/golang/freetype/truetype""golang.org/x/image/font""golang.org/x/image/font/gofont/gomono""github.com/pkg/errors")func AddWatermarkForImage(oriImage image.Image, uid string) (*image.RGBA, error) {watermarkedImage := image.NewRGBA(oriImage.Bounds())draw.Draw(watermarkedImage, oriImage.Bounds(), oriImage, image.Point{}, draw.Src)watermark, err := MakeImageByText(uid, color.Transparent)if err != nil {return nil, err}rotatedWatermark := imaging.Rotate(watermark, 30, color.Transparent)x, y := 0, 0for y <= watermarkedImage.Bounds().Max.Y {for x <= watermarkedImage.Bounds().Max.X {offset := image.Pt(x, y)draw.Draw(watermarkedImage, rotatedWatermark.Bounds().Add(offset), rotatedWatermark, image.Point{}, draw.Over)// 稀疏一点, 稍微提升点速度x += rotatedWatermark.Bounds().Dx() * 2}y += rotatedWatermark.Bounds().Dy()x = 0}return watermarkedImage, nil}// MakeImageByText 根据文本内容制作一个仅包含该文本内容的图片func MakeImageByText(text string, bgColor color.Color) (image.Image, error) {fontSize := float64(72)freetypeCtx := MakeFreetypeCtx(fontSize)width, height := int(fontSize)*len(text), int(fontSize)*2rgbaRect := image.NewRGBA(image.Rect(0, 0, width, height))// 仅当非透明时才做一次额外的渲染if bgColor != color.Transparent {bgUniform := image.NewUniform(bgColor)draw.Draw(rgbaRect, rgbaRect.Bounds(), bgUniform, image.Pt(0, 0), draw.Src)}freetypeCtx.SetClip(rgbaRect.Rect)freetypeCtx.SetDst(rgbaRect)pt := freetype.Pt(0, int(freetypeCtx.PointToFixed(fontSize)>>6))_, err := freetypeCtx.DrawString(text, pt)if err != nil {return nil, errors.WithStack(err)}return rgbaRect, nil}// MustParseFont 通过单测来保证该方法必不会 panicfunc MustParseFont() *truetype.Font {ft, err := freetype.ParseFont(gomono.TTF)if err != nil {panic(err)}return ft}func MakeFreetypeCtx(fontSize float64) *freetype.Context {fontColor := color.RGBA{R: 0, G: 0, B: 0, A: 50}fontColorUniform := image.NewUniform(fontColor)freetypeCtx := freetype.NewContext()freetypeCtx.SetDPI(100)freetypeCtx.SetFont(MustParseFont())freetypeCtx.SetFontSize(fontSize)freetypeCtx.SetSrc(fontColorUniform)freetypeCtx.SetHinting(font.HintingNone)return freetypeCtx}
// watermark_test.gopackage mainimport ("image""image/color""image/draw""image/jpeg""image/png""os""testing""github.com/stretchr/testify/assert")func TestMakeImageByText(t *testing.T) {t.Run("bg white", func(t *testing.T) {img, err := MakeImageByText("hello", color.White)assert.NoError(t, err)helloPng, err := os.Create("hello_white.png")assert.NoError(t, err)defer helloPng.Close()err = png.Encode(helloPng, img)assert.NoError(t, err)helloJpeg, err := os.Create("hello_white.jpeg")assert.NoError(t, err)defer helloJpeg.Close()err = jpeg.Encode(helloJpeg, img, nil)assert.NoError(t, err)})t.Run("bg transparent", func(t *testing.T) {img, err := MakeImageByText("hello", color.Transparent)assert.NoError(t, err)helloPng, err := os.Create("hello_transparent.png")assert.NoError(t, err)defer helloPng.Close()err = png.Encode(helloPng, img)assert.NoError(t, err)helloJpeg, err := os.Create("hello_transparent.jpeg")assert.NoError(t, err)defer helloJpeg.Close()// jpeg 没有 alpha 通道, 所以会是全黑的err = jpeg.Encode(helloJpeg, img, nil)assert.NoError(t, err)})}func TestMustParseFont(t *testing.T) {ft := MustParseFont()assert.NotNil(t, ft)}func BaseImageForTest() image.Image {rgbaRect := image.NewRGBA(image.Rect(0, 0, 3000, 2000))bgColor := color.RGBA{R: 0xff, G: 0, B: 0, A: 0xff}bg := image.NewUniform(bgColor)draw.Draw(rgbaRect, rgbaRect.Bounds(), bg, image.Pt(0, 0), draw.Src)return rgbaRect}func TestWassObject_AddWatermark(t *testing.T) {baseImg := BaseImageForTest()watermarkedImg, err := AddWatermarkForImage(baseImg, "hello.world")assert.NoError(t, err)helloWatermarkedJpeg, err := os.Create("hello_watermarked.jpeg")assert.NoError(t, err)defer helloWatermarkedJpeg.Close()err = jpeg.Encode(helloWatermarkedJpeg, watermarkedImg, nil)assert.NoError(t, err)}
效果
坑
- 最开始的思路是,计算出原图的对角线长度,制作出一个长宽均为对角线长度的 mask,把水印文字填充在 mask 上,旋转 mask,再把旋转后的 mask 盖在原图上。后发现因为旋转的是一个大图,所以旋转的耗时比较久,对于一些比较大的原始图片,旋转可能花个五六秒 (2核4G的机器)。因此改为了只旋转那个比较小的水印文字图。
- 对图片的处理本质是一个矩阵运算,因此计算量还是比较大的,cpu 和内存的占用量会比较大,功能上线前最好做一下压测
参考链接
https://johnpili.com/generate-text-to-image-in-go/
https://blog.csdn.net/diandianxiyu_geek/article/details/119546482
-
mysql--时间
mysql时间相关类型:date 年月日2023-1-15time 时分秒10:10:10datetime 年月日时分秒2023-1-1510:10:10timestamp
来源: 环球快资讯:golang 为图片加水印
mysql--时间
环球焦点!王思聪打人后行政拘留为什么能暂缓执行?罗翔科普
天天观速讯丨AMD悄悄公布31个CPU漏洞:4个极危险、Zen4高枕无忧
今日热文:Nginx面试题(史上最全 + 持续更新)
当前快讯:Atcoder Regular Contest ARC 153 A B C D 题解
焦点关注:PhotoEnhancer人工智能一键修复老照片,老照片修复,图像去噪
男子花32万买比亚迪海豹 内心崩溃:汽配城都没这么难看
焦点要闻:节能版酷睿i9-13900T现身:35W战平12900K
观天下!腾讯开出48人惩治名单 马化腾曾称内部贪腐“触目惊心”
Phi的反函数
【环球热闻】110度高烧不退!AMD RX 7900 XTX退换货率高达11%
为啥北方二十三过小年 南方却是二十四?和康熙乾隆有关
观察:无广告一年免费用!通信UOS家庭版22.0开始推送
111111
男子买898元零食P图付款 被抓现行:实际支付了1分钱
天天通讯!基于传奇车型AE86!丰田推出两款新能源概念改装车
CF构造题1600-1800(2)
女子骑电动车载两人闯红灯被撞 被判全责 网友:这才是公正
苹果回应iPhone车祸监测误报频发:正收集相关反馈
《新·福音战士剧场版:终》国内海报抄袭!竹也文化官方布道歉声明
Python开发的常用组件
每日观察!推荐一本正在看的书
环球今热点:几十年数学难题被谷歌研究员意外突破 当年差点被导师赶出门
B站2022百大UP主出炉:手工耿入选 走向世界的手工匠人
天天亮点!稳居春节档票房前三:《流浪地球2》官方揭秘太空电梯创作思路
世界讯息:12月新能源销量排名出炉:比亚迪吉利长安强攻 特斯拉扛不住了?
【全球独家】读编程与类型系统笔记08_面向对象变成的元素
观速讯丨长征第462发!我国成功发射一箭14星:“共享”火箭了解下
国内《新·福音战士剧场版:终》限定海报被指抄袭 官方正在联系画师确认
无法恢复!微软杀软Defender误删开始菜单/任务栏捷方式
天天观点:排量830cc 马自达转子发动机正式回归!首车发布
天天亮点!雨雪降温重心转移至南方 大范围雨雪天气明日结束
天天短讯!一步一步实现若依框架--2.3防止重复提交 repeat_submit
焦点快播:2022一年 特斯拉车主为地球节省20亿美元油费
每日消息!全球首现!四川一地发现新物种:长得特别好看
每日动态!《三体》剧版今日CCTV8、腾讯视频全网首播:会员提前看三集
天天观点:使用ActiveMQ Artemis进行重连
环球热议:千万别在有WiFi的房间里摆这种姿势
焦点观察:微软收购动视暴雪更难了!NVIDIA出手阻挠
环球观焦点:联名中国第一科幻IP!荣耀80 Pro《三体》动画定制版来了:限量卖
【全球独家】淘汰所有老款!新一代PS5主机年内到来:不向下兼容
环球热门:无磷配方 低泡易漂 绿伞洗衣液6斤17.9元
每日焦点!碰撞测试能拿一星 创维是造了什么“神仙”车
全球播报:中国科幻顶级IP首登荧屏!《三体》电视剧今晚央视、腾讯视频首播
中国制造多牛?世界最先进工厂:我们占了近一半
今日热文:堪比抢iPhone 泰国车主凌晨排队买!比亚迪泰国发运破万台
世界快报:微信全新拜年红包上线!支持语音祝福录制 动画效果太萌了
当前头条:Python树与树算法
B站大会员促销:12个月年卡到手价98元
天天动态:污染环境?代表建议允许春节分区分时燃放烟花 留住年味
每日消息!吓哭孩子!《中国奇谭》导演回应家长炮轰被网友赞:要走出国门征服老外
吃惊!杭州湿度达到100% 墙壁、窗台“挤”出水:网友吐槽难受到爆
当前聚焦:Linux中查看日志的常用命令
环球聚焦:算法学习笔记(8.2): 上下界网络流
当前最新:直播:央视网络春晚 最美女主播王冰冰亮相:王心凌等也来了
动态焦点:屏幕最小的第二代骁龙8旗舰!曝三星Galaxy S23卖6500元
老款iPhone激活原生灵动岛!DynamicCow教程来了
python批量发邮箱
有了这份Java面试中的葵花宝典,让你面试起飞!!!
每日时讯!还买什么Zen3/Zen4 6核酷睿i5-12490F到手1139元(首发1499)
焦点速讯:公司年终奖老员工人手1个30克金牌 感谢忠诚引热议:网友问还招人吗?
世界微资讯!Codeforces Round #843 (Div. 2) A1A2BCE(D待补)
储量超100万吨 瑞典发现欧洲最大稀土矿床:有望结束进口依赖
环球即时:首发4999元 Bose家庭娱乐扬声器550发布:支持TrueSpace增强原音
苹果iOS 17新特性和新功能抢先看!今年6月登场
有家长炮轰《中国奇谭》 导演回应:审美提高了就理解了
世界速看:Codeforces 1630 E Making It Bipartite 题解 (Dilworth定理)
世界播报:使用 Elasticsearch 搭建自己的搜索系统,这个厉害了。。
理解宏定义
2023春节新片预售票房破3000万:黑马杀出 《流浪地球2》仅排第三
数字化“乡村小道”跑得不舒服,试试低代码“高速公路”
当前看点!一位民办二本学生的年终总结
今日看点:荣耀首款小折叠屏来了:5千档真香
世界信息:今晚8点播出 王冰冰、撒贝宁等人组团剧透央视网络春晚
3999元解决安卓四大不可能 一加11成酷安最热机型:领先第二名一倍
认识Java语言
读编程与类型系统笔记07_子类型
张朝阳称年轻人不要只追求赚钱和快乐:想法不对 你会很痛苦 本人风趣回应
当前热讯:网易开始解散暴雪游戏相关团队!分手已成定局
世界微头条丨特斯拉海外大降价 美国新车主:恶心、不愿再看一眼爱车
全球快消息!门票值了!大熊猫看到游客后展示“才艺”:抱着竹子连续翻跟头
省钱还是抠门?马斯克不交房租:员工在工作日被房东赶出
当前视点!Netty-核心模块组件-4
环球视点!微信将处理假冒仿冒官方组织公众号:严重违规直接删号
全体起立!马自达MX-30 R-EV官图发布:转子发动机回归
全球要闻:雷军晒奖杯:《小米创业思考》获2022豆瓣年度大奖 揭秘小米创业经历
和女神视频聊天再也不害羞了!NVIDIA新技术让你“暗送秋波”:画面以假乱真
今日热讯:新娘刚下婚车遭痱子粉迎面砸脸引网友热议:婚闹是素质缺乏没教养?
当前讯息:“爱妻”来了!理想L7“皇后座”到底有多爽?1米2的腿部空间感受下
万元LV误标1599元被秒拍 得物回应:多次确认无异 无权干预
ruoyi打包jar分离配置部署
环球热消息:今晚8点见!2023央视网络春晚节目单发布:王心凌、董宇辉首次加盟
数论笔记-同余
“背菜女孩”家人回应1年赚20万 不穷:虚构捏造博眼球视频获流量应被整治
每日简讯:国铁西安局回应火车内设麻将桌:系主题定制列车 还有KTV、影院
【焦点热闻】苹果1200万像素为何胜过安卓1亿像素?历代iPhone相机揭秘:果然是神优化
记好这24个ES6方法,用于解决实际开发的JS问题
C#、TS和Dart对比3:编译时常量和运行时常量
2023性能战神!卢伟冰:Redmi K60 Pro是用户追求性能的不二之选