package handler import ( "encoding/base64" "net/http" "gen2d/internal/logger" "gen2d/internal/model" "gen2d/internal/service" "github.com/gin-gonic/gin" ) // EditImageRequest 图片编辑请求。 type EditImageRequest struct { Image string `json:"image" binding:"required"` // 底图 base64 编码 Prompt string `json:"prompt" binding:"required"` // 编辑指令 Count int `json:"count"` // 生成数量,默认 1 } // editAssetResponse 编辑结果素材(返回 base64)。 type editAssetResponse struct { Data string `json:"data"` Format string `json:"format"` } // EditImageResponse 图片编辑响应体。 type EditImageResponse struct { Assets []editAssetResponse `json:"assets"` } // EditImage 图片编辑接口,基于已有图片和文本指令生成修改后的图片。 func EditImage(c *gin.Context) { var req EditImageRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, model.Fail(http.StatusBadRequest, "参数错误: "+err.Error())) return } imageData, err := base64.StdEncoding.DecodeString(req.Image) if err != nil { c.JSON(http.StatusBadRequest, model.Fail(http.StatusBadRequest, "图片 base64 解码失败")) return } count := req.Count if count <= 0 { count = 1 } images, err := service.EditImages(c.Request.Context(), imageData, req.Prompt, count) if err != nil { logger.FromCtx(c.Request.Context()).Error("图片编辑失败", "error", err) c.JSON(http.StatusInternalServerError, model.Fail(http.StatusInternalServerError, "图片编辑失败")) return } assets := make([]editAssetResponse, len(images)) for i, img := range images { assets[i] = editAssetResponse{ Data: base64.StdEncoding.EncodeToString(img.Data), Format: img.Format, } } c.JSON(http.StatusOK, model.OK(EditImageResponse{Assets: assets})) }