From b084893de86cf4f15e37f49836e49fe25f19034e Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期四, 21 十一月 2019 13:54:29 +0800 Subject: [PATCH] add lib --- godraw.go | 123 +++++++++++++++++++++++++++++++++++++++++ 1 files changed, 123 insertions(+), 0 deletions(-) diff --git a/godraw.go b/godraw.go new file mode 100644 index 0000000..d923a23 --- /dev/null +++ b/godraw.go @@ -0,0 +1,123 @@ +package godraw + +import ( + "bufio" + "bytes" + "errors" + "image" + "image/color" + "image/jpeg" + + "github.com/llgcode/draw2d/draw2dimg" +) + +// ToImage bgr -> image.Image +func ToImage(data []byte, w, h int) (image.Image, error) { + width := w + height := h + step := w * 3 + channels := 3 + + img := image.NewRGBA(image.Rect(0, 0, width, height)) + c := color.RGBA{ + R: uint8(0), + G: uint8(0), + B: uint8(0), + A: uint8(255), + } + + for y := 0; y < height; y++ { + for x := 0; x < step; x = x + channels { + c.B = uint8(data[y*step+x]) + c.G = uint8(data[y*step+x+1]) + c.R = uint8(data[y*step+x+2]) + if channels == 4 { + c.A = uint8(data[y*step+x+3]) + } + img.SetRGBA(int(x/channels), y, c) + } + } + + return img, nil +} + +// Image2BGR img->bgr +func Image2BGR(img image.Image) []byte { + bounds := img.Bounds() + x := bounds.Dx() + y := bounds.Dy() + data := make([]byte, 0, x*y*3) + for j := bounds.Min.Y; j < bounds.Max.Y; j++ { + for i := bounds.Min.X; i < bounds.Max.X; i++ { + r, g, b, _ := img.At(i, j).RGBA() + data = append(data, byte(b>>8), byte(g>>8), byte(r>>8)) + } + } + return data +} + +// DrawRectangle draw rect +func DrawRectangle(img image.Image, rc image.Rectangle, clr color.RGBA, lw float64) error { + + l, t, r, b := rc.Min.X, rc.Min.Y, rc.Max.X, rc.Max.Y + + pt := []image.Point{ + image.Pt(l, t), + image.Pt(l, r), + image.Pt(r, b), + image.Pt(r, l), + } + + return DrawPolygon(img, pt, clr, lw) +} + +// DrawPolygon draw polygon +func DrawPolygon(img image.Image, pt []image.Point, clr color.RGBA, lw float64) error { + rgba, ok := img.(*image.RGBA) + if !ok { + return errors.New("IMAGE CONVERT TO RGBA ERROR") + } + + pt = append(pt, pt[0]) + + gc := draw2dimg.NewGraphicContext(rgba) + gc.SetStrokeColor(clr) + gc.SetLineWidth(lw) + + gc.BeginPath() + start := pt[0] + pt = pt[1:] + gc.MoveTo((float64)(start.X), (float64)(start.Y)) + for _, v := range pt { + gc.LineTo((float64)(v.X), (float64)(v.Y)) + } + // gc.QuadCurveTo(100, 10, 10, 10) + gc.Close() + gc.Stroke() + return nil +} + +// ToJpeg bgr -> jpeg file +func ToJpeg(bgr []byte, w, h int, quality *int) ([]byte, error) { + img, err := ToImage(bgr, w, h) + if err != nil { + return nil, err + } + return ImageToJpeg(img, quality) +} + +// ImageToJpeg save to jpeg data +func ImageToJpeg(img image.Image, quality *int) ([]byte, error) { + var o *jpeg.Options + + if quality != nil { + o = &jpeg.Options{Quality: *quality} + } + var b bytes.Buffer + w := bufio.NewWriter(&b) + err := jpeg.Encode(w, img, o) + if err != nil { + return nil, err + } + return b.Bytes(), err +} -- Gitblit v1.8.0