在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合成图片相关推荐

  1. golang 关于golang.org/x包问题

    关于golang.org/x包问题 由于谷歌被墙,跟谷歌相关的模块无法通过go get来下载,解决方法: git clone https://github.com/golang/net.git $GO ...

  2. golang 导入自定义包_goLang引入自定义包的方法

    看完golang的基本语法后,为了模块化编程,试用了下golang的包管理,结果真踩了几个坑,总结一下吧. 一. 设置$GOPATH环境变量 golang和C或php不一样,不会自动查找当前路径下的文 ...

  3. golang中的包管理工具——govendor和godep简单学习

    为什么用vendor目录 依赖问题 我们知道,一个工程稍大一点,通常会依赖各种各样的包.而Go使用统一的GOPATH管理依赖包,且每个包仅保留一个版本.而不同的依赖包由各自的版本工具独立管理,所以当所 ...

  4. 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 ...

  5. go get golang.org/x 包失败解决方法

    go get golang.org/x 包失败解决方法 参考文章: (1)go get golang.org/x 包失败解决方法 (2)https://www.cnblogs.com/hupeng12 ...

  6. 关于golang的time包总结

    目录 前言 time包详解 总结 前言 各种编程语言都少不了与时间有关的操作,因为很多判断都是基于时间,因此正确和方便的使用时间库就很重要额. golang提供了import "time&q ...

  7. 文字转图片,文字水印图片,合成图片,教你 Python 生成网站原创配图!

    又是为站佬们服务(写)水文的一篇,如何应用python来生成或者说是合成自己的原创图片,适合各位站群大佬哥们生成自己的图片,避免没有配图或者侵权碰瓷的尴尬,当然本渣渣这里分享的仅仅是源码demo,后续 ...

  8. 微信小程序canvas合成图片(海报),生成的图片展示不出来,或者空白。

    背景: 1.用户点击分享朋友圈,将二维码与一张背景图合成一张图片,然后将其显示. 2.用户点击保存图片将图片保存到手机相册里面. 问题: 用户点击分享盆友圈合成后的图片显示空白.控制台可以打印出来链接 ...

  9. ImageMagick利用蒙版合成图片

    先看合成后的效果图. 需要的图片素材: 1.一张图片(335x600) 2.一张蒙版图片(335x600) 3.一张相框图片(335x600) 第一步,根据蒙板和图片,截取图片.而且所截取的图片之外的 ...

  10. php 远程图片合拼,PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】...

    本文实例讲述了PHP实现将几张照片拼接到一起的合成图片功能.共享给大家供大家参考,详细如下: /** * 作品合成程序 * 针对单面,封面不做特殊处理 */ $src_path = $argv[1]; ...

最新文章

  1. Top Competitors(连接查询)
  2. 【PHP】 获取网站信息
  3. inputstreamreader未关闭会导致oom_【搞定面试官】你还在用Executors来创建线程池?会有什么问题呢?
  4. requestmapping注解作用_Java高级架构师-Spring 注解编程之注解属性别名与覆盖
  5. 四窗口能分布到四台显示器上吗? 回答 Galactica 的提问
  6. 【学习笔记】概率论与数理统计 - 陈希孺--第一章.事件的概率
  7. 迅雷,暴风影音,QQ这些软件是什么工具和语言编的?
  8. 三级网络技术--宽带接入技术--无线接入技术、光纤接入技术
  9. win10计算机磁盘图标,电脑win10系统磁盘分区ioc图标修改技巧
  10. ubuntu系统Firefox浏览器B站视频无法播放
  11. 计算机专业的浪漫情话,计算机学科的告白情话
  12. 智慧树知到网课中国马克思主义与当代课后所有章节测试答案
  13. 长度最小的子数组(力扣209)
  14. 移动端多页面APP(MPA)开发体验
  15. 参与IPFS项目最好的方式是买矿机挖Fil,而不是直接买币
  16. android强制缓存写磁盘,Android缓存之DiskLruCache磁盘缓存的使用
  17. Matlab-梁单元有限元分析(有限元基础-曾攀)
  18. 计算机仿真实训室建设,数控仿真实训室建设
  19. 手机chrome查看源代码_如何查看Chrome扩展程序的源代码
  20. C语言实战 - 贪吃蛇(图形界面)

热门文章

  1. 柳传志退休,联想的贸工技路线对错由后人评说
  2. 永久免费虚拟主机、免费云服务器,白嫖党福利!
  3. 操作系统-速记版(个人幕布导出)
  4. sel在c语言,iOS 你所不知道的SEL
  5. python实现jpeg转jpg
  6. linux串口无线透传,一种无线串口透传系统的制作方法
  7. 侯世达:为什么人工智能还远远谈不上「智能」?
  8. java随机不重复点名_怎样用java做一个点名器,除重复,并且用键盘输入
  9. 非标自动化转行机器人_工作4年,自动化工程师该不该转行
  10. 西门子主程序调用子程序_子程序编程举例说明-广数m98调用子程序实例-西门子子程序调用实例...