package util import ( "bytes" "encoding/json" "image" "io/ioutil" "net/http" "strconv" "webserver/extend/code" "basic.com/pubsub/protomsg.git" "github.com/gin-gonic/gin" "github.com/golang/glog" "github.com/pierrec/lz4" "gocv.io/x/gocv" "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 ReadImgData(url string) ([]byte, error) { resp, err := http.Get(url) if err != nil { return nil, err } defer resp.Body.Close() pix, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } return pix, nil } // 按尺寸去切图 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 } func StringIpToInt(ipstring string) int { ipSegs := strings.Split(ipstring, ".") var ipInt int = 0 var pos uint = 24 for _, ipSeg := range ipSegs { tempInt, _ := strconv.Atoi(ipSeg) tempInt = tempInt << pos ipInt = ipInt | tempInt pos -= 8 } return ipInt } func IpIntToString(ipInt int) string { ipSegs := make([]string, 4) var len int = len(ipSegs) buffer := bytes.NewBufferString("") for i := 0; i < len; i++ { tempInt := ipInt & 0xFF ipSegs[len-i-1] = strconv.Itoa(tempInt) ipInt = ipInt >> 8 } for i := 0; i < len; i++ { buffer.WriteString(ipSegs[i]) if i < len-1 { buffer.WriteString(".") } } return buffer.String() } func ParseScore(compareScore float32) float32 { if compareScore < 1 { compareScore = compareScore * 100 } f, _ := strconv.ParseFloat(fmt.Sprintf("%2.2f", compareScore), 32) return float32(f) } func ParseScore64(compareScore float64) float64 { if compareScore < 1 { compareScore = compareScore * 100 } f, _ := strconv.ParseFloat(fmt.Sprintf("%2.2f", compareScore), 64) return f } // UnCompress uncompress func UnCompress(in []byte) ([]byte, error) { out := make([]byte, 10*len(in)) n, err := lz4.UncompressBlock(in, out) if err != nil { fmt.Println(err) return nil, err } out = out[:n] // uncompressed data return out, nil } // Compress compress func Compress(in []byte) ([]byte, error) { out := make([]byte, len(in)) ht := make([]int, 64<<10) // buffer for the compression table n, err := lz4.CompressBlock(in, out, ht) if err != nil { fmt.Println(err) return nil, err } if n >= len(in) { fmt.Println("image is not compressible") } out = out[:n] // compressed data return out, nil }