需求:

1、将两张图片上下排列合成为一张新图片(就像平时去复印身份证,上面是正面,下面是反面);
2、新图片的宽度最大为 600 ;
3、最大高度不定义,保证图片原始宽高比即可;

问题排除:

关于图片的尺寸,可能会遇到以下几种情况:
1、两张图片宽度都大于600:直接以600为基准,进行缩放即可;
2、两张图片宽度不一致,并且小于600:以较小的图片宽度为基准,将较大图片的宽高比并进行缩放即可;

resize库中的Resize函数内部已经实现了自动计算图片宽高比的逻辑,所以,外部就不需要自己计算了。

实现:

package mainimport ("github.com/nfnt/resize""image""image/draw""image/jpeg""log""math""os"
)const MaxWidth float64 = 600func fixSize(img1W, img2W int) (new1W, new2W int) {var ( //为了方便计算,将两个图片的宽转为 float64img1Width, img2Width = float64(img1W), float64(img2W)ratio1, ratio2 float64)minWidth := math.Min(img1Width, img2Width) // 取出两张图片中宽度最小的为基准if minWidth > 600 { // 如果最小宽度大于600,那么两张图片都需要进行缩放ratio1 = MaxWidth / img1Width // 图片1的缩放比例ratio2 = MaxWidth / img2Width // 图片2的缩放比例// 原宽度 * 比例 = 新宽度return int(img1Width * ratio1), int(img2Width * ratio2)}// 如果最小宽度小于600,那么需要将较大的图片缩放,使得两张图片的宽度一致if minWidth == img1Width {ratio2 = minWidth / img2Width // 图片2的缩放比例return img1W, int(img2Width * ratio2)}ratio1 = minWidth / img1Width // 图片1的缩放比例return int(img1Width * ratio1), img2W
}func main() {file1, _ := os.Open("001.jpg") //打开图片1file2, _ := os.Open("002.jpg") //打开图片2defer file1.Close()defer file2.Close()// image.Decode 图片var (img1, img2 image.Imageerr        error)if img1, _, err = image.Decode(file1); err != nil {log.Fatal(err)return}if img2, _, err = image.Decode(file2); err != nil {log.Fatal(err)return}b1 := img1.Bounds()b2 := img2.Bounds()new1W, new2W := fixSize(b1.Max.X, b2.Max.X)// 调用resize库进行图片缩放(高度填0,resize.Resize函数中会自动计算缩放图片的宽高比)m1 := resize.Resize(uint(new1W), 0, img1, resize.Lanczos3)m2 := resize.Resize(uint(new2W), 0, img2, resize.Lanczos3)// 将两个图片合成一张newWidth := m1.Bounds().Max.X       //新宽度 = 随意一张图片的宽度newHeight := m1.Bounds().Max.Y + m2.Bounds().Max.Y // 新图片的高度为两张图片高度的和newImg := image.NewNRGBA(image.Rect(0, 0, newWidth, newHeight)) //创建一个新RGBA图像draw.Draw(newImg, newImg.Bounds(), m1, m1.Bounds().Min, draw.Over) //画上第一张缩放后的图片draw.Draw(newImg, newImg.Bounds(), m2, m2.Bounds().Min.Sub(image.Pt(0, m1.Bounds().Max.Y)), draw.Over) //画上第二张缩放后的图片(这里需要注意Y值的起始位置)// 保存文件imgfile, _ := os.Create("003.jpg")defer imgfile.Close()jpeg.Encode(imgfile, newImg, &jpeg.Options{100})
}

效果:

golang的图片操作:缩放图片+合成图片相关推荐

  1. CSS实现图片居中且缩放不影响图片纵横比

    实现代码 我们在编写页面代码的时候往往会需要添加图片.在使用过程中,获取的图片尺寸经常可能和页面需要的尺寸不一致,这时候就需要对获取图片进行缩放. 对图片缩放有一定技巧,或者说是固定的编写代码套路.否 ...

  2. 实用工具网站(搜索/PPT/图片操作...)

    1.搜索引擎 1.1.秘迹搜索 https://mijisou.com 一款无敌有良心.无敌安全的搜索引擎,不会收集私人信息,保护私隐,没有Cookie,并且秘迹搜索聚合了百度.360.Bing.搜狗 ...

  3. CSS背景图片 自适应缩放contain/cover

    background-size: contain; background-repeat: no-repeat; background-position-x: center; background-po ...

  4. [原创] 图片操作的类(ImageLibrary)-按比例缩放图片

    [原创] 图片操作的类(ImageLibrary)-按比例缩放图片 http://www.vjsdn.com/bbs/bbsTopicDetails.aspx?pid=241 转载于:https:// ...

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

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

  6. ImageIo类常用方法以及图片操作

    ImageIo类常用方法以及图片操作 文章目录 ImageIo类常用方法以及图片操作 常用方法 图片操作 结尾 常用方法 读 从图中可以看到有三个重载的方法,返回的类型都是BufferedImage ...

  7. Java图片转换为PDF并合成同一PDF

    1.需求 将同一文件夹下的图片和PDF,转换合并为同一个PDF,并要求转换中的图片按格式排版好 2.思路 调整图片,检测图片大小及方向,调整至A4大小(842×595), 寻找最佳缩放比,等比例缩放图 ...

  8. Android bitmap合成图片

    //根据项目需要,在一张图片上合成另一张图片(压缩后的),显示到预览图的imageview上,然后分享出去 大致思路:1,获取网络图片,计算宽高 2,预定于压缩后图片的宽高(也可是相对屏幕宽高的百分比 ...

  9. 《OpenCV3编程入门》学习笔记6 图像处理(六)图像金字塔与图片尺寸缩放

    6.6 图像金字塔与图片尺寸缩放 6.6.1 图像金字塔 1.图像金字塔是图像中多尺度表达的一种,主要用于图像分割,是一种以多分辨率解释图像的结构,通过梯次向下采样获得分辨率逐步降低的图象集合 2.分 ...

  10. Android实现对图片的缩放、剪切、旋转、存储

    一.问题描述 在开发中,当我们需要的有一张大图片同时还需要一些小图片时,我们只需要通过代码对此图片进行不同比例的缩放即可,这样大大节约资源,减小了安装包的尺寸 .除缩放外,我们还经常对图片进行其他操作 ...

最新文章

  1. 美国中学生被学校监控,实时位置、和谁接触一览无余
  2. 循序渐进Python3(十一) --6--  Ajax 实现跨域请求 jsonp 和 cors
  3. weblogic从入门到起飞!(受管服务器、免密启动、备份)(二)
  4. CRC生成多项式应该怎样定
  5. 链家java_链家2018春招Java工程师编程题题解
  6. Mac os下安装brew
  7. 网格布局每个网格都能放置一个组件_Android综合试题
  8. android studio gradle 国内代理
  9. UIView编程体验(一)
  10. vuejs 和 element 搭建的一个后台管理界面【收藏】
  11. 揭秘 IPython 的 5 种最佳调试方法
  12. CentOS 8下 MySQL 8.0 安装部署(亲测)
  13. centos是什么linux操作系统,CentOS系统是什么
  14. 新型开关电源优化设计与实例详解全书.pdf_开关电源工作时,如何抑制纹波和减小高频噪声?...
  15. 2021总结:躺平的一年
  16. 谷歌李开复 我的传奇人生源于十句箴言
  17. Swift 下标用法
  18. [BZOJ1208]宠物收养所
  19. c++thread里暂停线程_C语言如何正确的终止正在运行的子线程
  20. php微信公众号怎么开发_PHP对接微信公众平台消息接口开发流程详解及实例

热门文章

  1. Android 系列 5.13添加简单光栅动画
  2. PHP通过PHPMailer类库实现QQ邮箱发送方法
  3. 腾讯QQ空间穿越时光轴3D特效
  4. 四叶草数 ---JAVA代码实现
  5. PTA 7-6 sdut-oop-5 计算长方体和四棱锥的表面积和体积(类的继承) (10 分) JAVA
  6. 安装错误 Package requirements (json-c) were not met: No package ‘json-c‘ found
  7. 【AC自动机】P3966 [TJOI2013] 单词
  8. Android 10去除电池图标以及设置
  9. 常见web中间件及其漏洞概述
  10. 共饮维港夜色,TUV南德香港啤酒节精彩落幕