123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- package produce
- import (
- "bytes"
- "fmt"
- "image"
- "image/color"
- "image/draw"
- "image/png"
- "os"
- "strings"
- "time"
- "github.com/fogleman/gg"
- )
- type ImageInfo struct {
- dc *gg.Context
- }
- func (im *ImageInfo) testRunimage(sql string) ([]byte, error) {
-
- const padding = 20
- const charWidth = 10
- const lineHeight = 15
- const maxWidth = 2500
-
- lines := 0
- width := 0.0
- height := padding * 2
- lineWidth := 0.0
- im.dc = gg.NewContext(1, 1)
-
- if err := im.dc.LoadFontFace("/home/gtong/xugu_work/xg_autotest/assets/SimHei.ttf", 12); err != nil {
- fmt.Println(err.Error())
- return nil, nil
- }
-
- for _, r := range sql {
- w, _ := im.dc.MeasureString(string(r))
- if r == '\n' || lineWidth+w > float64(maxWidth-padding*2) {
- fmt.Printf("\r == 'n': \n")
- lines++
- if lineWidth > width {
- width = lineWidth
- fmt.Printf("\nwidth: %f\n", width)
- }
- lineWidth = 0.0
- }
- lineWidth += w
- }
- lines++
- if lineWidth > width {
-
- width = lineWidth
- fmt.Printf("lineWidth > width : %f", width)
- }
- height += (lines) * lineHeight
- im.dc = gg.NewContext(int(width+float64(padding*2)), int(height))
- im.dc.SetRGB(0, 0, 0)
- im.dc.Clear()
- im.dc.SetRGB(1, 1, 1)
-
- x := padding
- y := padding
- lineWidth = 0.0
- for _, r := range sql {
- w, _ := im.dc.MeasureString(string(r))
- if r == '\n' || lineWidth+w > float64(maxWidth-padding*2) {
- y += lineHeight
- lineWidth = 0.0
- if r == '\n' {
- continue
- }
- }
- im.dc.DrawString(string(r), float64(x)+lineWidth, float64(y))
- lineWidth += w
- }
-
- var buf bytes.Buffer
- if err := png.Encode(&buf, im.dc.Image()); err != nil {
- return nil, nil
- }
- name := "/home/gtong/xugu_work/xg_autotest/file/test_pic_1.png"
- newfile, err := os.Create(name)
- if err != nil {
- fmt.Println(err.Error())
- }
- defer newfile.Close()
- err = png.Encode(newfile, im.dc.Image())
- if err != nil {
- fmt.Println(err.Error())
- }
- return buf.Bytes(), nil
- }
- func (im *ImageInfo) Runimage(sql string) ([]byte, error) {
-
- width := 100
- height := 100
-
- fontSize := 20.0
- fontPath := "./assets/SimHei.ttf"
-
- dcTemp := gg.NewContext(100, 100)
-
- if err := dcTemp.LoadFontFace(fontPath, 10); err != nil {
- fmt.Println(err.Error())
- return nil, nil
- }
- SqlLines := strings.Split(sql, "\n")
-
-
-
-
- lineHeight := 0
- for _, line := range SqlLines {
- textWidth, _ := dcTemp.MeasureString(line)
- if int(textWidth) > width {
- width = int(textWidth)
- }
- lineHeight++
- }
-
- height += lineHeight * int(fontSize*1.2)
-
- width = int(width) * 2
- im.dc = gg.NewContext(width, height)
-
- if err := im.dc.LoadFontFace(fontPath, fontSize); err != nil {
- fmt.Println(err.Error())
- return nil, nil
- }
- im.dc.SetColor(color.Black)
- im.dc.Clear()
-
- im.dc.SetColor(color.White)
-
- lines := strings.Split(sql, "\n")
- x := 2.0
- y := 20.0
- for _, line := range lines {
- im.dc.DrawString(line, x, y)
- y += fontSize * 1.2
- }
-
- var buf bytes.Buffer
- if err := png.Encode(&buf, im.dc.Image()); err != nil {
- return nil, nil
- }
- return buf.Bytes(), nil
- }
- func (im *ImageInfo) SaveImage(fileName string) {
-
- newfile, err := os.Create(fmt.Sprintf("%s", fileName))
- if err != nil {
- fmt.Println(err.Error())
- return
- }
- defer newfile.Close()
-
-
- err = png.Encode(newfile, im.dc.Image())
- if err != nil {
- fmt.Println(err.Error())
- return
- }
- }
- func CreateFolder() string {
- dirName := "./file"
-
- if _, err := os.Stat(dirName); os.IsNotExist(err) {
-
- err := os.Mkdir(dirName, 0755)
- if err != nil {
- fmt.Println("创建文件夹失败:", err)
- return ""
- }
- fmt.Println("文件夹创建成功")
- } else if err != nil {
-
- fmt.Println("检查文件夹失败:", err)
- return ""
- } else {
-
- fmt.Println("文件夹已经存在")
- }
- dirName = fmt.Sprintf("%s/%s", dirName, time.Now())
- err := os.Mkdir(dirName, 0755)
- if err != nil {
- fmt.Println("创建文件夹失败:", err)
- return ""
- }
- return dirName
- }
- func MergeImages(imageBytes [][]byte) ([]byte, error) {
- var maxWidth int
- var totalHeight int
-
- for _, imgData := range imageBytes {
- img, _, err := image.Decode(bytes.NewReader(imgData))
- if err != nil {
- return nil, err
- }
- bounds := img.Bounds()
- if bounds.Dx() > maxWidth {
- maxWidth = bounds.Dx()
- }
- totalHeight += bounds.Dy()
- }
-
- dst := image.NewRGBA(image.Rect(0, 0, maxWidth, totalHeight))
- draw.Draw(dst, dst.Bounds(), &image.Uniform{color.Black}, image.Point{}, draw.Src)
-
- var offsetY int
- for _, imgData := range imageBytes {
- img, _, err := image.Decode(bytes.NewReader(imgData))
- if err != nil {
- return nil, err
- }
- bounds := img.Bounds()
- draw.Draw(dst, image.Rect(0, offsetY, bounds.Dx(), offsetY+bounds.Dy()), img, image.Point{}, draw.Src)
- offsetY += bounds.Dy()
- }
-
- var buf bytes.Buffer
- err := png.Encode(&buf, dst)
- if err != nil {
- return nil, err
- }
- return buf.Bytes(), nil
- }
|