Files
wechat_ipad_pro/clientsdk/imagetool.go
2026-02-17 13:06:23 +08:00

107 lines
2.6 KiB
Go

package clientsdk
import (
"bytes"
"github.com/lunny/log"
"image"
"image/gif"
"image/jpeg"
"image/png"
"net/http"
"github.com/nfnt/resize"
"xiawan/wx/clientsdk/baseinfo"
)
// CreateThumbImage 生成缩略图
func CreateThumbImage(fileData []byte) *baseinfo.ThumbItem {
filetype := http.DetectContentType(fileData)
if filetype == "image/png" {
return CreatePngThumbImage(fileData)
}
if filetype == "image/jpeg" {
return CreateJpegThumbImage(fileData)
}
return nil
}
// CreateJpegThumbImage 创建JPEG图片的缩略图
func CreateJpegThumbImage(srcImage []byte) *baseinfo.ThumbItem {
// 获取图片数据
srcImg, _ := jpeg.Decode(bytes.NewBuffer(srcImage))
// 缩略图宽/高设置成 120
width := uint(0)
height := uint(120)
if srcImg.Bounds().Dx() > srcImg.Bounds().Dy() {
width = 120
height = 0
}
// 生产缩略图
thumbImage := resize.Resize(width, height, srcImg, resize.Lanczos3)
emptyBuff := bytes.NewBuffer(nil)
// write new image to file
jpeg.Encode(emptyBuff, thumbImage, nil)
retThumbItem := &baseinfo.ThumbItem{}
retThumbItem.Data = emptyBuff.Bytes()
retThumbItem.Width = int32(thumbImage.Bounds().Dx())
retThumbItem.Height = int32(thumbImage.Bounds().Dy())
return retThumbItem
}
// CreatePngThumbImage 创建png图片的缩略图
func CreatePngThumbImage(srcImage []byte) *baseinfo.ThumbItem {
// 获取图片数据
srcImg, _ := png.Decode(bytes.NewBuffer(srcImage))
// 缩略图宽/高设置成 120
width := uint(0)
height := uint(120)
if srcImg.Bounds().Dx() > srcImg.Bounds().Dy() {
width = 120
height = 0
}
// 生产缩略图
thumbImage := resize.Resize(width, height, srcImg, resize.Lanczos3)
emptyBuff := bytes.NewBuffer(nil)
// write new image to file
png.Encode(emptyBuff, thumbImage)
// 返回数据
retThumbItem := &baseinfo.ThumbItem{}
retThumbItem.Data = emptyBuff.Bytes()
retThumbItem.Width = int32(thumbImage.Bounds().Dx())
retThumbItem.Height = int32(thumbImage.Bounds().Dy())
return retThumbItem
}
// GetImageBounds 获取图片数据的宽高
func GetImageBounds(fileData []byte) (uint32, uint32) {
if fileData == nil || len(fileData) <= 0 {
log.Error("获取图片数据的宽高error!")
return uint32(400), uint32(500)
}
filetype := http.DetectContentType(fileData)
var srcImg image.Image
if filetype == "image/png" {
srcImg, _ = png.Decode(bytes.NewBuffer(fileData))
}
if filetype == "image/jpeg" {
srcImg, _ = jpeg.Decode(bytes.NewBuffer(fileData))
}
if filetype == "image/gif" {
srcImg, _ = gif.Decode(bytes.NewBuffer(fileData))
}
return uint32(srcImg.Bounds().Dx()), uint32(srcImg.Bounds().Dy())
}