golang使用image包及draw.Draw合成图片
在golang中合成图片,一般使用image包及draw.Draw即可,images包的具体方法和用法:https://studygolang.com/pkgdoc
代码中图片缩放的包:github.com/nfnt/resize
/**
从url中获取图片资源*/
func readImgData(url string) image.Image {resp, err := http.Get(url)if err != nil {logs.Info("图片获取失败", err)return nil}defer resp.Body.Close()img,_,err := image.Decode(resp.Body)if err != nil {logs.Info("图片decode失败", err)return nil}return img
}// 计算图片缩放后的尺寸
func calculateRatioFit(srcWidth, srcHeight int, defaultWidth, defaultHeight float64) (int, int) {ratio := math.Min(defaultWidth/float64(srcWidth), defaultHeight/float64(srcHeight))return int(math.Ceil(float64(srcWidth) * ratio)), int(math.Ceil(float64(srcHeight) * ratio))
}/**
3图合1,创建图片
*/
func CreatePicture(img1Url, img2Url, img3Url string) (map[string]interface{},bool) {returnData := make(map[string]interface{})if img1Url == "" || img2Url == "" || img3Url == "" {return nil, false}//根据图片地址获取图片.img1 := readImgData(img1Url)img2 := readImgData(img2Url)img3 := readImgData(img3Url)if img1 == nil || img2 == nil || img3 == nil {return nil, false}//图片1缩放b1 := img1.Bounds()img1Width := b1.Max.Ximg1Height := b1.Max.Yw1, h1 := calculateRatioFit(img1Width, img1Height, 344, 344)img1m := resize.Resize(uint(w1), uint(h1), img1, resize.Lanczos3)//图片2缩放b2 := img2.Bounds()img2Width := b2.Max.Ximg2Height := b2.Max.Yw2, h2 := calculateRatioFit(img2Width, img2Height, 172, 172)img2m := resize.Resize(uint(w2), uint(h2), img2, resize.Lanczos3)//图片3缩放b3 := img3.Bounds()img3Width := b3.Max.Ximg3Height := b3.Max.Yw3, h3 := calculateRatioFit(img3Width, img3Height, 172, 172)img3m := resize.Resize(uint(w3), uint(h3), img3, resize.Lanczos3)//创建源图fileName := "dst.jpg"file, err := os.Create(fileName)if err != nil {return nil,false}defer func() {err := file.Close()if err != nil {logs.Info("CreateGoodsPicture:图片资源关闭错误", err)}}()//图片三合一绘图jpg := image.NewRGBA(image.Rect(0, 0, 344, 516))draw.Draw(jpg, jpg.Bounds().Add(image.Pt(0,0)), img1m, img1m.Bounds().Min, draw.Src)draw.Draw(jpg, jpg.Bounds().Add(image.Pt(0,344)), img2m, img2m.Bounds().Min, draw.Src)draw.Draw(jpg, jpg.Bounds().Add(image.Pt(172,344)), img3m, img3m.Bounds().Min, draw.Src)//jpeg.Encode默认图片质量75%err1 := jpeg.Encode(file, jpg, nil)if err1 != nil {logs.Info("CreateGoodsPicture:图片png.Encode错误", err1)return nil, false}defer func() {err := os.Remove(fileName)if err != nil {logs.Info("CreateGoodsPicture:图片资源删除错误", err)}}()return returnData, true
}
golang使用image包及draw.Draw合成图片相关推荐
- golang 关于golang.org/x包问题
关于golang.org/x包问题 由于谷歌被墙,跟谷歌相关的模块无法通过go get来下载,解决方法: git clone https://github.com/golang/net.git $GO ...
- golang 导入自定义包_goLang引入自定义包的方法
看完golang的基本语法后,为了模块化编程,试用了下golang的包管理,结果真踩了几个坑,总结一下吧. 一. 设置$GOPATH环境变量 golang和C或php不一样,不会自动查找当前路径下的文 ...
- golang中的包管理工具——govendor和godep简单学习
为什么用vendor目录 依赖问题 我们知道,一个工程稍大一点,通常会依赖各种各样的包.而Go使用统一的GOPATH管理依赖包,且每个包仅保留一个版本.而不同的依赖包由各自的版本工具独立管理,所以当所 ...
- linux 使用 go get 报 unrecognized import path “golang.org/x/crypto/XXX“ 的解决方法及手动安装 golang.org/x 包方法
问题描述 在linux上使用 go get -u github.com/astaxie/beego ,安装beego框架环境时报 unrecognized import path "gola ...
- go get golang.org/x 包失败解决方法
go get golang.org/x 包失败解决方法 参考文章: (1)go get golang.org/x 包失败解决方法 (2)https://www.cnblogs.com/hupeng12 ...
- 关于golang的time包总结
目录 前言 time包详解 总结 前言 各种编程语言都少不了与时间有关的操作,因为很多判断都是基于时间,因此正确和方便的使用时间库就很重要额. golang提供了import "time&q ...
- 文字转图片,文字水印图片,合成图片,教你 Python 生成网站原创配图!
又是为站佬们服务(写)水文的一篇,如何应用python来生成或者说是合成自己的原创图片,适合各位站群大佬哥们生成自己的图片,避免没有配图或者侵权碰瓷的尴尬,当然本渣渣这里分享的仅仅是源码demo,后续 ...
- 微信小程序canvas合成图片(海报),生成的图片展示不出来,或者空白。
背景: 1.用户点击分享朋友圈,将二维码与一张背景图合成一张图片,然后将其显示. 2.用户点击保存图片将图片保存到手机相册里面. 问题: 用户点击分享盆友圈合成后的图片显示空白.控制台可以打印出来链接 ...
- ImageMagick利用蒙版合成图片
先看合成后的效果图. 需要的图片素材: 1.一张图片(335x600) 2.一张蒙版图片(335x600) 3.一张相框图片(335x600) 第一步,根据蒙板和图片,截取图片.而且所截取的图片之外的 ...
- php 远程图片合拼,PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】...
本文实例讲述了PHP实现将几张照片拼接到一起的合成图片功能.共享给大家供大家参考,详细如下: /** * 作品合成程序 * 针对单面,封面不做特殊处理 */ $src_path = $argv[1]; ...
最新文章
- Top Competitors(连接查询)
- 【PHP】 获取网站信息
- inputstreamreader未关闭会导致oom_【搞定面试官】你还在用Executors来创建线程池?会有什么问题呢?
- requestmapping注解作用_Java高级架构师-Spring 注解编程之注解属性别名与覆盖
- 四窗口能分布到四台显示器上吗? 回答 Galactica 的提问
- 【学习笔记】概率论与数理统计 - 陈希孺--第一章.事件的概率
- 迅雷,暴风影音,QQ这些软件是什么工具和语言编的?
- 三级网络技术--宽带接入技术--无线接入技术、光纤接入技术
- win10计算机磁盘图标,电脑win10系统磁盘分区ioc图标修改技巧
- ubuntu系统Firefox浏览器B站视频无法播放
- 计算机专业的浪漫情话,计算机学科的告白情话
- 智慧树知到网课中国马克思主义与当代课后所有章节测试答案
- 长度最小的子数组(力扣209)
- 移动端多页面APP(MPA)开发体验
- 参与IPFS项目最好的方式是买矿机挖Fil,而不是直接买币
- android强制缓存写磁盘,Android缓存之DiskLruCache磁盘缓存的使用
- Matlab-梁单元有限元分析(有限元基础-曾攀)
- 计算机仿真实训室建设,数控仿真实训室建设
- 手机chrome查看源代码_如何查看Chrome扩展程序的源代码
- C语言实战 - 贪吃蛇(图形界面)
热门文章
- 柳传志退休,联想的贸工技路线对错由后人评说
- 永久免费虚拟主机、免费云服务器,白嫖党福利!
- 操作系统-速记版(个人幕布导出)
- sel在c语言,iOS 你所不知道的SEL
- python实现jpeg转jpg
- linux串口无线透传,一种无线串口透传系统的制作方法
- 侯世达:为什么人工智能还远远谈不上「智能」?
- java随机不重复点名_怎样用java做一个点名器,除重复,并且用键盘输入
- 非标自动化转行机器人_工作4年,自动化工程师该不该转行
- 西门子主程序调用子程序_子程序编程举例说明-广数m98调用子程序实例-西门子子程序调用实例...