package controller import ( "encoding/json" "fmt" "github.com/gin-gonic/gin" setting "icloudapp.cn/tools/config" "icloudapp.cn/tools/entity" "icloudapp.cn/tools/model" "icloudapp.cn/tools/util" "icloudapp.cn/tools/util/image" "os" "time" ) func Preview(ctx *gin.Context) { file := ctx.Query("file") if file == "" { entity.ResponseError(ctx, entity.CodePageNotFound) return } path, _ := os.Getwd() thumb := image.NewImage(setting.Conf.CacheDir) thumb.SetSize(300, 300) thumb.SetFile(fmt.Sprintf("%s/%s", path, file)) fileWm, err := thumb.Thumb() if err != nil { entity.ResponseNormal(ctx, entity.CodeSystemError, err.Error(), []interface{}{}) return } defer fileWm.Destroy() //不写入文件,直接返回给浏览器 _, err = ctx.Writer.Write(fileWm.GetImageBlob()) if err != nil { entity.ResponseNormal(ctx, entity.CodeSystemError, fmt.Sprintf("ctx.Writer.Write err: %s", err.Error()), []interface{}{}) return } } func Image(ctx *gin.Context) { jsonByte, err := os.ReadFile("data.json") if err != nil { entity.ResponseNormal(ctx, entity.CodeSystemError, err.Error(), []interface{}{}) return } var posterJson image.PosterJson err = json.Unmarshal(jsonByte, &posterJson) if err != nil { entity.ResponseNormal(ctx, entity.CodeSystemError, err.Error(), []interface{}{}) return } poster := image.NewPoster(ctx) file, err := poster.Create(posterJson) if err != nil { entity.ResponseNormal(ctx, entity.CodeSystemError, fmt.Sprintf("poster.Create err : %s", err.Error()), []interface{}{}) return } if err = file.SetImageFormat("PNG"); err != nil { entity.ResponseNormal(ctx, entity.CodeSystemError, fmt.Sprintf("file.SetImageFormat err : %s", err.Error()), []interface{}{}) return } defer file.Destroy() if posterJson.Quality == 0 { posterJson.Quality = 50 } if err = file.SetCompressionQuality(uint(posterJson.Quality)); err != nil { entity.ResponseNormal(ctx, entity.CodeSystemError, fmt.Sprintf("file.SetCompressionQuality err: %s", err.Error()), []interface{}{}) return } //不写入文件,直接返回给浏览器 _, err = ctx.Writer.Write(file.GetImageBlob()) if err != nil { entity.ResponseNormal(ctx, entity.CodeSystemError, fmt.Sprintf("ctx.Writer.Write err: %s", err.Error()), []interface{}{}) return } } // Cut 裁切指定的图片 func Cut(ctx *gin.Context) { file := ctx.Query("file") if file == "" { entity.ResponseError(ctx, entity.CodePageNotFound) return } path, _ := os.Getwd() thumb := image.NewImage(setting.Conf.CacheDir) thumb.SetSize(400, 400) thumb.SetFile(fmt.Sprintf("%s/%s", path, file)) fileWm, err := thumb.Cut("center") if err != nil { entity.ResponseNormal(ctx, entity.CodeSystemError, err.Error(), []interface{}{}) return } defer fileWm.Destroy() //不写入文件,直接返回给浏览器 _, err = ctx.Writer.Write(fileWm.GetImageBlob()) if err != nil { entity.ResponseNormal(ctx, entity.CodeSystemError, fmt.Sprintf("ctx.Writer.Write err: %s", err.Error()), []interface{}{}) return } } func SavePoster(ctx *gin.Context) { } // PosterInfo 获取指定posterID的海报信息 func PosterInfo(ctx *gin.Context) { var request entity.PosterInfoRequest if err := ctx.ShouldBind(&request); err != nil { entity.ResponseError(ctx, entity.CodeInvalidParam) return } sUserPoster := model.NewUserPoster(ctx) info, err := sUserPoster.Info(request.PosterID) if err != nil { entity.ResponseNormal(ctx, entity.CodeServerBusy, info.Msg, nil) return } var api entity.UserPosterInfoForApi api.Code = info.Code api.Msg = info.Msg api.Body.Poster = info.Body entity.ResponseNormal(ctx, api.Code, api.Msg, api.Body) } // DrawImage 生成指定posterID的海报 func DrawImage(ctx *gin.Context) { sinceStart := time.Now() var request entity.PosterInfoRequest if err := ctx.ShouldBind(&request); err != nil { entity.ResponseError(ctx, entity.CodeInvalidParam) return } sUserPoster := model.NewUserPoster(ctx) info, err := sUserPoster.Info(request.PosterID) if err != nil { entity.ResponseNormal(ctx, entity.CodeServerBusy, info.Msg, nil) return } spendTime := time.Since(sinceStart) fmt.Println("查询数据耗时:", spendTime) startTime := time.Now() var posterJson image.PosterJson err = json.Unmarshal([]byte(info.Body.PosterJson), &posterJson) if err != nil { entity.ResponseNormal(ctx, entity.CodeSystemError, err.Error(), []interface{}{}) return } endTime := time.Since(startTime) fmt.Println("解压数据耗时:", endTime) poster := image.NewPoster(ctx) file, err := poster.Create(posterJson) if err != nil { entity.ResponseNormal(ctx, entity.CodeSystemError, fmt.Sprintf("poster.Create err : %s", err.Error()), []interface{}{}) return } if err = file.SetImageFormat("PNG"); err != nil { entity.ResponseNormal(ctx, entity.CodeSystemError, fmt.Sprintf("file.SetImageFormat err : %s", err.Error()), []interface{}{}) return } defer file.Destroy() defer util.TimeCost("渲染数据消耗")() if posterJson.Quality == 0 { posterJson.Quality = 50 } if err = file.SetCompressionQuality(uint(posterJson.Quality)); err != nil { entity.ResponseNormal(ctx, entity.CodeSystemError, fmt.Sprintf("file.SetCompressionQuality err: %s", err.Error()), []interface{}{}) return } //不写入文件,直接返回给浏览器 _, err = ctx.Writer.Write(file.GetImageBlob()) if err != nil { entity.ResponseNormal(ctx, entity.CodeSystemError, fmt.Sprintf("ctx.Writer.Write err: %s", err.Error()), []interface{}{}) return } } // Posters 通过用户ID获取用户名下的所有海报 func Posters(ctx *gin.Context) { uid := GetUID(ctx) if uid == 0 { entity.ResponseNormal(ctx, entity.CodeDenied, "请登录后再试", []interface{}{}) return } mUserPoster := model.NewUserPoster(ctx) simpleLists := mUserPoster.SimpleLists(uid) userPostersForApi := &entity.UserPostersForApi{ Code: 0, Msg: "success", Body: map[string][]entity.PostersListForApi{ "posters": simpleLists, }, } entity.ResponseSuccess(ctx, userPostersForApi) }