gf-common/utils/base64Image.go

103 lines
2.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package utils
import (
"encoding/base64"
"fmt"
"image"
"image/jpeg"
"image/png"
"io/ioutil"
"os"
"strings"
)
// Base64ToImage 将Base64编码的数据转换为图片并保存到指定路径
func Base64ToImage(base64String, outputPath string) error {
// 移除Base64数据URI前缀如果有
if strings.Contains(base64String, ",") {
base64String = strings.Split(base64String, ",")[1]
}
// 解码Base64字符串
imageData, err := base64.StdEncoding.DecodeString(base64String)
if err != nil {
return fmt.Errorf("解码Base64数据时出错: %v", err)
}
// 将解码后的数据写入文件
err = ioutil.WriteFile(outputPath, imageData, 0644)
if err != nil {
return fmt.Errorf("保存图片文件时出错: %v", err)
}
return nil
}
// Base64ToImageWithFormat 将Base64编码的数据转换为指定格式的图片并保存
func Base64ToImageWithFormat(base64String, outputPath, format string) error {
// 移除Base64数据URI前缀如果有
if strings.Contains(base64String, ",") {
base64String = strings.Split(base64String, ",")[1]
}
// 解码Base64字符串
imageData, err := base64.StdEncoding.DecodeString(base64String)
if err != nil {
return fmt.Errorf("解码Base64数据时出错: %v", err)
}
// 创建文件
file, err := os.Create(outputPath)
if err != nil {
return fmt.Errorf("创建图片文件时出错: %v", err)
}
defer file.Close()
// 根据指定格式编码图片
switch strings.ToLower(format) {
case "jpeg", "jpg":
// 解码图片
img, _, err := image.Decode(strings.NewReader(string(imageData)))
if err != nil {
return fmt.Errorf("解码图片时出错: %v", err)
}
// 编码为JPEG格式
err = jpeg.Encode(file, img, &jpeg.Options{Quality: 90})
if err != nil {
return fmt.Errorf("编码JPEG图片时出错: %v", err)
}
case "png":
// 解码图片
img, _, err := image.Decode(strings.NewReader(string(imageData)))
if err != nil {
return fmt.Errorf("解码图片时出错: %v", err)
}
// 编码为PNG格式
err = png.Encode(file, img)
if err != nil {
return fmt.Errorf("编码PNG图片时出错: %v", err)
}
default:
// 直接写入原始数据
_, err = file.Write(imageData)
if err != nil {
return fmt.Errorf("写入图片数据时出错: %v", err)
}
}
return nil
}
// GetImageFormatFromBase64 从Base64数据中获取图片格式
func GetImageFormatFromBase64(base64String string) string {
// 检查数据URI前缀
if strings.HasPrefix(base64String, "data:image/") {
// 提取格式信息
format := strings.Split(strings.Split(base64String, ";")[0], "/")[1]
return format
}
return "unknown"
}