107 lines
2.6 KiB
Go
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())
|
|
}
|