首页 > 其他分享 >golang 合成的图片

golang 合成的图片

时间:2024-09-09 18:14:41浏览次数:9  
标签:return nil err 合成 Bounds golang signImage image 图片

package picture_service

import (
	"errors"
	"github.com/nfnt/resize"
	"image"
	"image/draw"
	"image/jpeg"
	"image/png"
	"log"
	"net/http"
	"os"
)

type PictureService struct{}

func NewPictureService() *PictureService {
	return &PictureService{}
}

func (service *PictureService) PictureMerge(sign string, pic string, newImagePath string, left int, up int, picWidth int, picHeight int, signWidth int, signHeight int) (err error) {
	signFile, err := os.Open(sign)
	if err != nil {
		return
	}
	defer signFile.Close()
	sImage, _, err := image.Decode(signFile)
	if err != nil {
		return
	}
	signImage := resize.Resize(uint(signWidth), uint(signHeight), sImage, resize.Lanczos3)
	picFile, err := os.Open(pic)
	if err != nil {
		return
	}
	defer picFile.Close()
	picBytes, err := os.ReadFile(pic)
	if err != nil {
		return
	}
	contentType := http.DetectContentType(picBytes)
	var picImage image.Image
	if contentType == "image/jpeg" || contentType == "image/jpg" {
		picImage, err = jpeg.Decode(picFile)
		if err != nil {
			return
		}
	} else if contentType == "image/png" {
		picImage, err = png.Decode(picFile)
		if err != nil {
			return
		}
	} else {
		return errors.New("未知图片类型")
	}
	// 重置底图大小
	resizePicImage := resize.Resize(uint(picWidth), uint(picHeight), picImage, resize.Lanczos3)
	// 新建画布,边界与底图一致
	templateImage := image.NewRGBA(resizePicImage.Bounds())
	// 将底图覆盖画布上,坐标起点为0,0
	draw.Draw(templateImage, resizePicImage.Bounds(), resizePicImage, resizePicImage.Bounds().Min, draw.Over)
	if err != nil {
		log.Panicln(err.Error())
		return
	}
	// 签章图片的高、宽的 1/2 就是,签章图片中心到右下角距离。文字信息的中心:向左距离(left),向上距离(up)
	// left -宽 = l,up - 高 = h
	// 向左移动 l,向上移动 h,就可以让印章图的中心点和文字的中心点总是重合,这样印章就是总是在文字上面
	imaCenterLeft := signImage.Bounds().Dx() / 2
	imaCenterUp := signImage.Bounds().Dy() / 2
	l := left - imaCenterLeft
	h := up - imaCenterUp
	// 向左移动X减少,向上移动Y减少
	offset := image.Pt(templateImage.Bounds().Dx()-signImage.Bounds().Dx()-l, templateImage.Bounds().Dy()-signImage.Bounds().Dy()-h)
	draw.Draw(
		templateImage,
		signImage.Bounds().Add(offset),
		signImage,
		// 0,0 为起点
		image.Point{},
		draw.Over)
	err = service.savePng(templateImage, newImagePath)
	return
}

func (service *PictureService) savePng(pic *image.RGBA, path string) (err error) {
	dstFile, err := os.Create(path)
	if err != nil {
		return
	}
	defer dstFile.Close()
	err = png.Encode(dstFile, pic)
	return
}

标签:return,nil,err,合成,Bounds,golang,signImage,image,图片
From: https://www.cnblogs.com/jing1024/p/18405044

相关文章

  • 避坑指南:Golang框架自动化测试中的常见问题与解决方案大全
    在使用Golang框架进行自动化测试的过程中,开发者常常会遇到各种各样的问题。为了帮助大家避免一些常见的坑,我整理了一份详细的避坑指南,希望能对大家的开发工作有所帮助。忽视测试用例的独立性在进行自动化测试时,很多人会犯的一个错误是让测试用例之间产生依赖。比如,测试用例A需......
  • golang中关于死锁的思考与学习
    1、Golang中死锁的触发条件1.1书上关于死锁的四个必要条件的讲解发生死锁时,线程永远不能完成,系统资源被阻碍使用,以致于阻止了其他作业开始执行。在讨论处理死锁问题的各种方法之前,我们首先深入讨论一下死锁特点。必要条件:如果在一个系统中以下四个条件同时成立,那么就能引起死......
  • LivePortrait: 让静态图像“活”起来、更好地控制图片/视频中人物的表情,新增动物模式,
     引言随着AI技术的飞速发展,图像生成与编辑的门槛不断降低,尤其在人像视频生成领域取得了令人瞩目的成就。快手可灵大模型团队开源的LivePortrait框架,以其出色的性能与创新的设计,引领了AI生成的新浪潮。LivePortrait不仅能够将静态图像转换为动态视频,还能精确控制面......
  • Canvas绘制图片合成样式
    效果图web*{margin:0;padding:0;}.container{position:relative;width:328px;height:328px;margin:100pxauto;}.containerimg{position:absolute;width:328px;height:328px;}#canvas{posi......
  • 深入探索AI文生语音技术的奥秘:从文本输入到逼真语音输出的全链条语音合成过程解析
    深入探索AI文生语音技术的奥秘:从文本输入到逼真语音输出的全链条语音合成过程解析1.语音合成任务简介1.1.语音与文本对比语音来说,NLP技术在深度学习中更为普及。在介绍语音合成任务前,我们先来了解语音这一模态的特点,并将其与文本模态对比。文本模态语音模态表现方式......
  • Vue2 - 详细实现聊天室IM即时通讯及聊天界面,支持发送图片视频、消息已读未读等,集成mqt
    前言如果您需要Vue3版本,请访问在vue2|nuxt2项目开发中,详解手机移动端H5网页在线1v1聊天功能(仿腾讯云IM功能),技术栈为MQTT通讯协议+后端Node服务端+数据库设计+vue前端聊天界面,超详细前后端完整流程及示例源代码,vue2聊天即时通讯IM实时接收和发送消息,可发送文字、图......
  • 优爱酷酷采系统软件支持批量链接采集可指定深度、资源嗅探支持10大类资源,批量下载短视
    图文详情如何批量嗅探资源采集网页链接?图像音频视频JsCssHtmlJson文档字体压缩其它自动下载链接转换仿站批量格式转换.webP,.avif格式图片下载,优爱酷酷采系统-想采就采把握精彩留住美好下载:UiCool.cn 【优爱酷酷采系统】✅链接:https://www.alipan.com/s/LxDVE3pjN......
  • 【Golang】LeetCode面试经典150题:45. 跳跃游戏 II
    题干:给定一个长度为 n 的 0索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i+j] 处:0<=j<=nums[i] i+j<n返回到达 nums[n-1] 的最小跳跃次数......
  • JPGC批量图片压缩神器!绝了,仅仅几百K!
    JPGC是一款专为图片批量处理设计的工具,它能够帮助用户快速将JPG/JPEG格式的图片进行压缩,以减小文件大小,同时尽量保持图片质量。这款软件特别适合处理数码相机拍摄的照片,压缩效果显著,文件大小可减少至原来的20%-30%左右。软件支持多线程操作,大幅提升了批量处理的效率,并且界面设......
  • aspose word转换pdf文件后将pdf文件转换为图片png
    asposeword转换pdf文件后将pdf文件转换为图片png链接:asposeword模板文件生成pdfhttps://www.cnblogs.com/oktokeep/p/16615900.htmlpackagecom.example.core.mydemo.aspose;importorg.apache.pdfbox.pdmodel.PDDocument;importorg.apache.pdfbox.rendering.ImageType;......