golang image 智能合并图片
🕚 Sat, 04 Mar 2017 by GolangNote
golang image 智能合并图片,自动识别图片类型,合并后缩放。
package util
import (
"fmt"
"image"
"image/draw"
"image/gif"
"image/jpeg"
"image/png"
"net/http"
"os"
"github.com/nfnt/resize"
)
func CheckImageType2(filePath string) (string, error) {
file, err := os.Open(filePath)
if err != nil {
return "", err
}
defer file.Close()
buff := make([]byte, 512) // why 512 bytes ? see http://golang.org/pkg/net/http/#DetectContentType
_, err = file.Read(buff)
if err != nil {
return "", err
}
filetype := http.DetectContentType(buff)
fmt.Println(filetype)
switch filetype {
case "image/jpeg", "image/jpg":
fmt.Println(filetype)
return "jpg", nil
case "image/gif":
fmt.Println(filetype)
case "image/png":
fmt.Println(filetype)
case "application/pdf": // not image, but application !
fmt.Println(filetype)
default:
fmt.Println("unknown file type uploaded")
}
return "aa", nil
}
func GetImageObj(filePath string) (img image.Image, err error) {
f1Src, err := os.Open(filePath)
if err != nil {
return nil, err
}
defer f1Src.Close()
buff := make([]byte, 512) // why 512 bytes ? see http://golang.org/pkg/net/http/#DetectContentType
_, err = f1Src.Read(buff)
if err != nil {
return nil, err
}
filetype := http.DetectContentType(buff)
fmt.Println(filetype)
fSrc, err := os.Open(filePath)
defer fSrc.Close()
switch filetype {
case "image/jpeg", "image/jpg":
img, err = jpeg.Decode(fSrc)
if err != nil {
fmt.Println("jpeg error")
return nil, err
}
case "image/gif":
img, err = gif.Decode(fSrc)
if err != nil {
return nil, err
}
case "image/png":
img, err = png.Decode(fSrc)
if err != nil {
return nil, err
}
default:
return nil, err
}
return img, nil
}
func MergeImage(worksDir string, file1 string, file2 string, newName string) (string, error) {
src, err := GetImageObj(worksDir + file1)
if err != nil {
return "", err
}
srcB := src.Bounds().Max
src1, err := GetImageObj(worksDir + file2)
if err != nil {
return "", err
}
src1B := src.Bounds().Max
newWidth := srcB.X + src1B.X
newHeight := srcB.Y
if src1B.Y > newHeight {
newHeight = src1B.Y
}
des := image.NewRGBA(image.Rect(0, 0, newWidth, newHeight)) // 底板
draw.Draw(des, des.Bounds(), src, src.Bounds().Min, draw.Over) //首先将一个图片信息存入jpg
draw.Draw(des, image.Rect(srcB.X, 0, newWidth, src1B.Y), src1, image.ZP, draw.Over) //将另外一张图片信息存入jpg
fSave, err := os.Create(worksDir + newName)
if err != nil {
return "", err
}
defer fSave.Close()
var opt jpeg.Options
opt.Quality = 80
newImage := resize.Resize(1024, 0, des, resize.Lanczos3)
err = jpeg.Encode(fSave, newImage, &opt) // put quality to 80%
if err != nil {
return "", err
}
return newName, nil
}
本文网址: https://golangnote.com/topic/149.html (转载注明出处)
关于GolangNote:记录在工作中使用golang 遇到、面临的相关问题及解决方法。如果你在这里获得一些知识或信息,解决你的编程问题,请考虑捐赠给不幸的人或者你喜欢的慈善机构,除捐赠外,种植树木、志愿服务或减少排碳的行为也很有益处。如果你有任何问题可以在下面 留言
Be the first to comment!
Relative Articles
Recent Go Articles
- Golang 把cookie 字符串解析为cookie 结构
- Golang 计算字符串中包含某个或某些字符集的个数
- 使用Golang 对文件增删写读操作备忘
- Go Modules 使用备忘
- 使用Golang 简单删除图片exif 信息
- 谷歌翻译的 golang 库推荐
- Go 1.13.2 与1.13.3 紧急更新
- golang 人脸检测识别库
- Go build 错误 “stackcheck redeclared in this block previous declaration”的解决方法
- Golang phantomjs 动态代理实现
- Golang chrome debug protocol 库推荐
- Golang 随机打乱数组/Slice
- Golang sync.WaitGroup 的 Wait 超时处理
- Golang实现简单的Socks5代理
- Golang 用snappy + Base64 简单压缩加密进行网络传输
- Golang http IPv4/IPv6 服务
- golang 全角半角相互转换
- 在自己的网站部署TLS 1.3
- Golang 实现/打印菜单树
- Golang telegram 机器人小试
Top Go Articles
- golang 原生xml 转json
- golang 为Windows XP/Server 2003 编译程序
- Golang 实现/打印菜单树
- golang 生成良好的唯一ID/uuid库比较
- golang map 按value 大小排序,降序和升序
- groupcache 使用入门
- Golang实现简单的Socks5代理
- golang 正确获取绝对路径的方法
- go完成了自举
- Golang io.ReadCloser 和[]byte 相互转化的方法
- golang 文档的两个镜像
- Golang 获取两个数之间的随机数
- golang image 智能合并图片
- Golang 字符串毫秒转时间格式
- golang 用 crypto/bcrypt 存储密码的例子
- mismatched types time.Duration and int
- golang Selenium WebDriver 使用记录
- go post 上传文件的例子
- Golang http.Post 用最小的内存发送大文件
- 谷歌翻译的 golang 库推荐