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