|
| 1 | +// Package score 签到,答题得分 |
| 2 | +package score |
| 3 | + |
| 4 | +import ( |
| 5 | + "bytes" |
| 6 | + "fmt" |
| 7 | + "image" |
| 8 | + "image/color" |
| 9 | + "strconv" |
| 10 | + "time" |
| 11 | + |
| 12 | + "github.com/FloatTech/ZeroBot-Plugin/kanban/banner" |
| 13 | + "github.com/FloatTech/floatbox/file" |
| 14 | + "github.com/FloatTech/gg" |
| 15 | + "github.com/FloatTech/imgfactory" |
| 16 | + "github.com/FloatTech/zbputils/control" |
| 17 | + "github.com/FloatTech/zbputils/img/text" |
| 18 | + "github.com/disintegration/imaging" |
| 19 | +) |
| 20 | + |
| 21 | +func drawScore16(a *scdata) (image.Image, error) { |
| 22 | + // 绘图 |
| 23 | + getAvatar, err := initPic(a.picfile, a.uid) |
| 24 | + if err != nil { |
| 25 | + return nil, err |
| 26 | + } |
| 27 | + back, err := gg.LoadImage(a.picfile) |
| 28 | + if err != nil { |
| 29 | + return nil, err |
| 30 | + } |
| 31 | + // 避免图片过大,最大 1280*720 |
| 32 | + back = imgfactory.Limit(back, 1280, 720) |
| 33 | + imgDX := back.Bounds().Dx() |
| 34 | + imgDY := back.Bounds().Dy() |
| 35 | + canvas := gg.NewContext(imgDX, imgDY) |
| 36 | + // draw Aero Style |
| 37 | + aeroStyle := gg.NewContext(imgDX-202, imgDY-202) |
| 38 | + aeroStyle.DrawImage(imaging.Blur(back, 2.5), -100, -100) |
| 39 | + // aero draw image. |
| 40 | + aeroStyle.DrawRoundedRectangle(0, 0, float64(imgDX-200), float64(imgDY-200), 16) |
| 41 | + // SideLine |
| 42 | + aeroStyle.SetLineWidth(3) |
| 43 | + aeroStyle.SetRGBA255(255, 255, 255, 100) |
| 44 | + aeroStyle.StrokePreserve() |
| 45 | + aeroStyle.SetRGBA255(255, 255, 255, 140) |
| 46 | + // fill |
| 47 | + aeroStyle.Fill() |
| 48 | + // draw background |
| 49 | + canvas.DrawImage(back, 0, 0) |
| 50 | + // Aero style combine |
| 51 | + canvas.DrawImage(aeroStyle.Image(), 100, 100) |
| 52 | + canvas.Fill() |
| 53 | + hourWord := getHourWord(time.Now()) |
| 54 | + avatar, _, err := image.Decode(bytes.NewReader(getAvatar)) |
| 55 | + if err != nil { |
| 56 | + return nil, err |
| 57 | + } |
| 58 | + avatarf := imgfactory.Size(avatar, 200, 200) |
| 59 | + canvas.DrawImage(avatarf.Circle(0).Image(), 120, 120) |
| 60 | + // draw info(name,coin,etc) |
| 61 | + canvas.SetRGB255(0, 0, 0) |
| 62 | + data, err := file.GetLazyData(text.BoldFontFile, control.Md5File, true) |
| 63 | + if err != nil { |
| 64 | + return nil, err |
| 65 | + } |
| 66 | + if err = canvas.ParseFontFace(data, 50); err != nil { |
| 67 | + return nil, err |
| 68 | + } |
| 69 | + // draw head |
| 70 | + canvas.DrawStringWrapped(a.nickname, 350, 180, 0.5, 0.5, 0.5, 0.5, gg.AlignLeft) |
| 71 | + canvas.Fill() |
| 72 | + // main draw |
| 73 | + data, err = file.GetLazyData(text.FontFile, control.Md5File, true) |
| 74 | + if err != nil { |
| 75 | + return nil, err |
| 76 | + } |
| 77 | + if err = canvas.ParseFontFace(data, 30); err != nil { |
| 78 | + return nil, err |
| 79 | + } |
| 80 | + canvas.DrawStringAnchored(hourWord, 350, 280, 0, 0) |
| 81 | + canvas.DrawStringAnchored("ATRI币 + "+strconv.Itoa(a.inc), 350, 350, 0, 0) |
| 82 | + canvas.DrawStringAnchored("当前ATRI币:"+strconv.Itoa(a.score), 350, 400, 0, 0) |
| 83 | + canvas.DrawStringAnchored("LEVEL: "+strconv.Itoa(getrank(a.level)), 350, 450, 0, 0) |
| 84 | + // draw Info(Time,etc.) |
| 85 | + getTime := time.Now().Format("2006-01-02 15:04:05") |
| 86 | + getTimeLengthWidth, getTimeLengthHight := canvas.MeasureString(getTime) |
| 87 | + canvas.DrawStringAnchored(getTime, float64(imgDX)-100-20-getTimeLengthWidth/2, float64(imgDY)-100-getTimeLengthHight, 0.5, 0.5) // time |
| 88 | + var nextrankScore int |
| 89 | + if a.rank < 10 { |
| 90 | + nextrankScore = rankArray[a.rank+1] |
| 91 | + } else { |
| 92 | + nextrankScore = SCOREMAX |
| 93 | + } |
| 94 | + nextLevelStyle := strconv.Itoa(a.level) + "/" + strconv.Itoa(nextrankScore) |
| 95 | + getLevelLength, _ := canvas.MeasureString(nextLevelStyle) |
| 96 | + canvas.DrawStringAnchored(nextLevelStyle, 100+getLevelLength, float64(imgDY)-100-getTimeLengthHight, 0.5, 0.5) // time |
| 97 | + canvas.Fill() |
| 98 | + canvas.SetRGB255(255, 255, 255) |
| 99 | + if err = canvas.ParseFontFace(data, 20); err != nil { |
| 100 | + return nil, err |
| 101 | + } |
| 102 | + canvas.DrawStringAnchored("Created By Zerobot-Plugin "+banner.Version, float64(imgDX)/2, float64(imgDY)-20, 0.5, 0.5) // zbp |
| 103 | + canvas.SetRGB255(0, 0, 0) |
| 104 | + canvas.DrawStringAnchored("Created By Zerobot-Plugin "+banner.Version, float64(imgDX)/2-3, float64(imgDY)-19, 0.5, 0.5) // zbp |
| 105 | + canvas.SetRGB255(255, 255, 255) |
| 106 | + // Gradient |
| 107 | + grad := gg.NewLinearGradient(20, 320, 400, 20) |
| 108 | + grad.AddColorStop(0, color.RGBA{G: 255, A: 255}) |
| 109 | + grad.AddColorStop(1, color.RGBA{B: 255, A: 255}) |
| 110 | + grad.AddColorStop(0.5, color.RGBA{R: 255, A: 255}) |
| 111 | + canvas.SetStrokeStyle(grad) |
| 112 | + canvas.SetLineWidth(4) |
| 113 | + // level array with rectangle work. |
| 114 | + gradLineLength := float64(imgDX-120) - 120 |
| 115 | + renderLine := (float64(a.level) / float64(nextrankScore)) * gradLineLength |
| 116 | + canvas.MoveTo(120, float64(imgDY)-102) |
| 117 | + canvas.LineTo(120+renderLine, float64(imgDY)-102) |
| 118 | + canvas.ClosePath() |
| 119 | + canvas.Stroke() |
| 120 | + return canvas.Image(), nil |
| 121 | +} |
| 122 | + |
| 123 | +func drawScore15(a *scdata) (image.Image, error) { |
| 124 | + // 绘图 |
| 125 | + _, err := initPic(a.picfile, a.uid) |
| 126 | + if err != nil { |
| 127 | + return nil, err |
| 128 | + } |
| 129 | + back, err := gg.LoadImage(a.picfile) |
| 130 | + if err != nil { |
| 131 | + return nil, err |
| 132 | + } |
| 133 | + // 避免图片过大,最大 1280*720 |
| 134 | + back = imgfactory.Limit(back, 1280, 720) |
| 135 | + canvas := gg.NewContext(back.Bounds().Size().X, int(float64(back.Bounds().Size().Y)*1.7)) |
| 136 | + canvas.SetRGB(1, 1, 1) |
| 137 | + canvas.Clear() |
| 138 | + canvas.DrawImage(back, 0, 0) |
| 139 | + monthWord := time.Now().Format("01/02") |
| 140 | + hourWord := getHourWord(time.Now()) |
| 141 | + _, err = file.GetLazyData(text.BoldFontFile, control.Md5File, true) |
| 142 | + if err != nil { |
| 143 | + return nil, err |
| 144 | + } |
| 145 | + if err = canvas.LoadFontFace(text.BoldFontFile, float64(back.Bounds().Size().X)*0.1); err != nil { |
| 146 | + return nil, err |
| 147 | + } |
| 148 | + canvas.SetRGB(0, 0, 0) |
| 149 | + canvas.DrawString(hourWord, float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.2) |
| 150 | + canvas.DrawString(monthWord, float64(back.Bounds().Size().X)*0.6, float64(back.Bounds().Size().Y)*1.2) |
| 151 | + _, err = file.GetLazyData(text.FontFile, control.Md5File, true) |
| 152 | + if err != nil { |
| 153 | + return nil, err |
| 154 | + } |
| 155 | + if err = canvas.LoadFontFace(text.FontFile, float64(back.Bounds().Size().X)*0.04); err != nil { |
| 156 | + return nil, err |
| 157 | + } |
| 158 | + canvas.DrawString(a.nickname+fmt.Sprintf(" ATRI币+%d", a.inc), float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.3) |
| 159 | + canvas.DrawString("当前ATRI币:"+strconv.FormatInt(int64(a.score), 10), float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.4) |
| 160 | + canvas.DrawString("LEVEL:"+strconv.FormatInt(int64(a.rank), 10), float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.5) |
| 161 | + canvas.DrawRectangle(float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.55, float64(back.Bounds().Size().X)*0.6, float64(back.Bounds().Size().Y)*0.1) |
| 162 | + canvas.SetRGB255(150, 150, 150) |
| 163 | + canvas.Fill() |
| 164 | + var nextrankScore int |
| 165 | + if a.rank < 10 { |
| 166 | + nextrankScore = rankArray[a.rank+1] |
| 167 | + } else { |
| 168 | + nextrankScore = SCOREMAX |
| 169 | + } |
| 170 | + canvas.SetRGB255(0, 0, 0) |
| 171 | + canvas.DrawRectangle(float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.55, float64(back.Bounds().Size().X)*0.6*float64(a.level)/float64(nextrankScore), float64(back.Bounds().Size().Y)*0.1) |
| 172 | + canvas.SetRGB255(102, 102, 102) |
| 173 | + canvas.Fill() |
| 174 | + canvas.DrawString(fmt.Sprintf("%d/%d", a.level, nextrankScore), float64(back.Bounds().Size().X)*0.75, float64(back.Bounds().Size().Y)*1.62) |
| 175 | + return canvas.Image(), nil |
| 176 | +} |
0 commit comments