feat:新增转换成jpg
This commit is contained in:
parent
fcc838ff43
commit
f4a0117c04
@ -1,6 +1,7 @@
|
||||
package imports
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
@ -8,6 +9,9 @@ import (
|
||||
apiCast "fonchain-fiee/api/cast"
|
||||
"fonchain-fiee/pkg/config"
|
||||
"fonchain-fiee/pkg/service"
|
||||
"image"
|
||||
"image/draw"
|
||||
"image/jpeg"
|
||||
"io"
|
||||
"log"
|
||||
"math/rand"
|
||||
@ -571,21 +575,17 @@ func downloadAndUploadToBucket(imageURL string) (string, error) {
|
||||
return "", fmt.Errorf("创建临时目录失败: %v", err)
|
||||
}
|
||||
defer os.RemoveAll(tempDir) // 程序结束时清理整个目录
|
||||
|
||||
// 生成唯一文件名
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
fileName := fmt.Sprintf("%d%04d.jpg", time.Now().Unix(), rand.Intn(10000))
|
||||
timestamp := time.Now().Unix()
|
||||
randomNum := rand.Intn(10000)
|
||||
fileName := fmt.Sprintf("%d%04d.jpg", timestamp, randomNum)
|
||||
|
||||
// 构建文件路径
|
||||
imgPath := filepath.Join(tempDir, fileName)
|
||||
|
||||
// 创建文件
|
||||
file, err := os.Create(imgPath)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("创建文件失败: %v", err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
log.Printf("文件创建在: %s", imgPath)
|
||||
|
||||
// 下载图片到文件
|
||||
// 下载图片
|
||||
resp, err := http.Get(imageURL)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("下载图片失败: %v", err)
|
||||
@ -596,32 +596,47 @@ func downloadAndUploadToBucket(imageURL string) (string, error) {
|
||||
return "", fmt.Errorf("下载失败,状态码: %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
// 复制到文件
|
||||
_, err = io.Copy(file, resp.Body)
|
||||
// 读取图片数据
|
||||
imgData, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("保存文件失败: %v", err)
|
||||
return "", fmt.Errorf("读取图片数据失败: %v", err)
|
||||
}
|
||||
|
||||
file.Sync()
|
||||
|
||||
fileBytes, err := os.ReadFile(imgPath)
|
||||
// 检测图片格式并转换为JPG
|
||||
jpgData, err := convertToJPG(imgData)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("读取本地文件失败: %v", err)
|
||||
return "", fmt.Errorf("转换图片格式失败: %v", err)
|
||||
}
|
||||
|
||||
// 保存转换后的JPG文件
|
||||
if err := os.WriteFile(imgPath, jpgData, 0644); err != nil {
|
||||
return "", fmt.Errorf("保存JPG文件失败: %v", err)
|
||||
}
|
||||
|
||||
// 上传到对象存储
|
||||
BOSClient, err := objstorage.NewOSS(
|
||||
os.Getenv(config.ConfigData.Oss.AccessKeyId),
|
||||
os.Getenv(config.ConfigData.Oss.AccessKeySecret),
|
||||
os.Getenv(config.ConfigData.Oss.Endpoint),
|
||||
)
|
||||
if BOSClient == nil {
|
||||
return "", fmt.Errorf("上传文件失败: %v", err)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("创建OSS客户端失败: %v", err)
|
||||
}
|
||||
_, err = BOSClient.PutObjectFromBytes(os.Getenv(config.ConfigData.Oss.BucketName), fileName, fileBytes)
|
||||
if BOSClient == nil {
|
||||
return "", fmt.Errorf("OSS客户端为空")
|
||||
}
|
||||
|
||||
_, err = BOSClient.PutObjectFromBytes(os.Getenv(config.ConfigData.Oss.BucketName), fileName, jpgData)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("上传文件失败: %v", err)
|
||||
}
|
||||
//if BOSClient == nil {
|
||||
|
||||
// 返回CDN URL
|
||||
url := fmt.Sprintf("%s/%s", os.Getenv(config.ConfigData.Oss.CdnHost), fileName)
|
||||
return url, nil
|
||||
}
|
||||
|
||||
//上传到桶
|
||||
//BOSClient, err := objstorage.NewOSS(
|
||||
// config.ConfigData.Oss.AccessKeyId,
|
||||
@ -637,9 +652,6 @@ func downloadAndUploadToBucket(imageURL string) (string, error) {
|
||||
//}
|
||||
//url := fmt.Sprintf("%s/%s", config.ConfigData.Oss.CdnHost, fileName)
|
||||
|
||||
return url, nil
|
||||
}
|
||||
|
||||
func (p *BatchProcessor) generateTitleAndContent(req *excelData) (string, string, error) {
|
||||
if req.PhotoUrl != "" {
|
||||
title, content, err := NewAiGenerator().GenerateTitleAndContentFromImage(
|
||||
@ -679,7 +691,7 @@ func (p *BatchProcessor) generateImage(req *excelData) (string, error) {
|
||||
prompt += "\n要求不能出现:低质量、残缺、人物正脸、多余的手指、乱码字符和文字、比例不良,场景以国内场景为主"
|
||||
|
||||
if req.PhotoDpi == "" {
|
||||
req.PhotoDpi = "720*1280"
|
||||
req.PhotoDpi = "1024*1024"
|
||||
|
||||
}
|
||||
result, err := NewAiGenerator().TextToImage(
|
||||
@ -693,6 +705,33 @@ func (p *BatchProcessor) generateImage(req *excelData) (string, error) {
|
||||
return result.Output.TaskID, nil
|
||||
}
|
||||
|
||||
// convertToJPG 将图片数据转换为JPG格式
|
||||
func convertToJPG(imgData []byte) ([]byte, error) {
|
||||
// 使用标准库解码
|
||||
img, format, err := image.Decode(bytes.NewReader(imgData))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("解码图片失败: %v", err)
|
||||
}
|
||||
|
||||
log.Printf("检测到图片格式: %s, 尺寸: %dx%d", format, img.Bounds().Dx(), img.Bounds().Dy())
|
||||
|
||||
// 创建新的RGBA图片
|
||||
bounds := img.Bounds()
|
||||
rgba := image.NewRGBA(bounds)
|
||||
|
||||
// 绘制到RGBA
|
||||
draw.Draw(rgba, bounds, img, bounds.Min, draw.Src)
|
||||
|
||||
// 编码为JPG
|
||||
var buf bytes.Buffer
|
||||
opts := &jpeg.Options{Quality: 90} // 设置质量为90%
|
||||
if err := jpeg.Encode(&buf, rgba, opts); err != nil {
|
||||
return nil, fmt.Errorf("编码JPG失败: %v", err)
|
||||
}
|
||||
|
||||
return buf.Bytes(), nil
|
||||
}
|
||||
|
||||
//func (p *BatchProcessor) StartPolling() {
|
||||
// go func() {
|
||||
// ticker := time.NewTicker(p.pollInterval) // 1秒间隔
|
||||
|
||||
@ -58,6 +58,7 @@ func publishImage(req publishImageReq) (err error) {
|
||||
|
||||
//---------------------------------------------------发布
|
||||
_, err = service.CastProvider.UpdateWorkImage(context.Background(), &apiCast.UpdateWorkImageReq{
|
||||
ArtistSubNum: list.UserList[0].SubNum,
|
||||
Title: req.Title,
|
||||
Content: req.Content,
|
||||
Images: req.GeneratePhotoUrl,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user