package util import ( "basic.com/pubsub/protomsg.git" "encoding/json" "github.com/gin-gonic/gin" "github.com/golang/glog" "gocv.io/x/gocv" "image" "webserver/extend/code" "crypto/rand" "fmt" "reflect" "strings" ) // iterater field of struct to lowcast. // return type: string slice. func FiledbyStuct(stuct interface{}) []string { var strtmp []string t := reflect.TypeOf(stuct) for i := 0; i < t.NumField(); i++ { strtmp = append(strtmp, strings.ToLower(string(t.Field(i).Name))) } return strtmp } // // ResponseFormat 返回数据格式化 func ResponseFormat(c *gin.Context, respStatus *code.Code, data interface{}) { if respStatus == nil { glog.Error("response status param not found!") respStatus = code.RequestParamError } c.JSON(respStatus.Status, gin.H{ "code": respStatus.Status, "success": respStatus.Success, "msg": respStatus.Message, "data": data, }) return } func PseudoUuid() (uuid string) { b := make([]byte, 16) rand.Read(b) uuid = fmt.Sprintf("%X-%X-%X-%X-%X", b[0:4], b[4:6], b[6:8], b[8:10], b[10:]) return } //struct转map func Struct2Map(obj interface{}) map[string]interface{} { resultMap :=make(map[string]interface{},0) bytesData, err := json.Marshal(obj) if err !=nil { return resultMap } json.Unmarshal(bytesData, &resultMap) return resultMap // //t := reflect.TypeOf(obj) //v := reflect.ValueOf(obj) // //var data = make(map[string]interface{}) //for i := 0; i < t.NumField(); i++ { // data[t.Field(i).Name] = v.Field(i).Interface() //} //return data } // 按尺寸去切图 func SubImg(i protomsg.Image, x0, y0, x1, y1 int, ) []byte { img, _ := gocv.NewMatFromBytes(int(i.Height), int(i.Width), gocv.MatTypeCV8UC3, i.Data) rect := image.Rect(EnlargeSize(x0, y0, x1, y1, i)) region := img.Region(rect) bytes, _ := gocv.IMEncode(".jpg", region) return bytes } // 长宽变为一比一,每边各扩百分之20 func EnlargeSize(x0, y0, x1, y1 int, i protomsg.Image) (x0_new, y0_new, x1_new, y1_new int) { // 先把长宽变为一比一 chazhi := (y1 - y0) - (x1 - x0) x0 = x0 - chazhi/2 if x0 < 0 { x0 = 0 } x1 = x1 + chazhi/2 if x1 > int(i.Width) { x1 = int(i.Width) } // 再把每边各扩大百分之20 enlarge := float32(0.2) x0_new = int((1+enlarge)*float32(x0) - enlarge*float32(x1)) if x0_new < 0 { x0_new = 0 } x1_new = int((1+enlarge)*float32(x1) - enlarge*float32(x0)) if x1_new > int(i.Width) { x1_new = int(i.Width) } y0_new = int((1+enlarge)*float32(y0) - enlarge*float32(y1)) if y0_new < 0 { y0_new = 0 } y1_new = int((1+enlarge)*float32(y1) - enlarge*float32(y0)) if y1_new > int(i.Height) { y1_new = int(i.Height) } return }