@@ -3,15 +3,18 @@ package score
3
3
4
4
import (
5
5
"bytes"
6
+ "errors"
6
7
"fmt"
7
8
"image"
8
9
"image/color"
9
10
"strconv"
11
+ "sync"
10
12
"time"
11
13
12
14
"github.com/FloatTech/floatbox/file"
13
15
"github.com/FloatTech/gg"
14
16
"github.com/FloatTech/imgfactory"
17
+ "github.com/FloatTech/rendercard"
15
18
"github.com/FloatTech/zbputils/control"
16
19
"github.com/FloatTech/zbputils/img/text"
17
20
"github.com/disintegration/imaging"
@@ -269,3 +272,219 @@ func drawScore17(a *scdata) (image.Image, error) {
269
272
canvas .SetRGB255 (255 , 255 , 255 )
270
273
return canvas .Image (), nil
271
274
}
275
+
276
+ func drawScore17b2 (a * scdata ) (img image.Image , err error ) {
277
+ fontdata , err := file .GetLazyData (text .GlowSansFontFile , control .Md5File , false )
278
+ if err != nil {
279
+ return
280
+ }
281
+
282
+ getAvatar , err := initPic (a .picfile , a .uid )
283
+ if err != nil {
284
+ return
285
+ }
286
+
287
+ back , err := gg .LoadImage (a .picfile )
288
+ if err != nil {
289
+ return
290
+ }
291
+
292
+ bx , by := float64 (back .Bounds ().Dx ()), float64 (back .Bounds ().Dy ())
293
+
294
+ sc := 1280 / bx
295
+
296
+ colors := gg .TakeColor (back , 3 )
297
+
298
+ canvas := gg .NewContext (1280 , 1280 * int (by )/ int (bx ))
299
+
300
+ cw , ch := float64 (canvas .W ()), float64 (canvas .H ())
301
+
302
+ sch := ch * 6 / 10
303
+
304
+ var blurback , scbackimg , backshadowimg , avatarimg , avatarbackimg , avatarshadowimg , whitetext , blacktext image.Image
305
+ var wg sync.WaitGroup
306
+ wg .Add (8 )
307
+
308
+ go func () {
309
+ defer wg .Done ()
310
+ scback := gg .NewContext (canvas .W (), canvas .H ())
311
+ scback .ScaleAbout (sc , sc , cw / 2 , ch / 2 )
312
+ scback .DrawImageAnchored (back , canvas .W ()/ 2 , canvas .H ()/ 2 , 0.5 , 0.5 )
313
+ scback .Identity ()
314
+
315
+ go func () {
316
+ defer wg .Done ()
317
+ blurback = imaging .Blur (scback .Image (), 20 )
318
+ }()
319
+
320
+ scbackimg = rendercard .Fillet (scback .Image (), 12 )
321
+ }()
322
+
323
+ go func () {
324
+ defer wg .Done ()
325
+ pureblack := gg .NewContext (canvas .W (), canvas .H ())
326
+ pureblack .SetRGBA255 (0 , 0 , 0 , 255 )
327
+ pureblack .Clear ()
328
+
329
+ shadow := gg .NewContext (canvas .W (), canvas .H ())
330
+ shadow .ScaleAbout (0.6 , 0.6 , cw - cw / 3 , ch / 2 )
331
+ shadow .DrawImageAnchored (pureblack .Image (), canvas .W ()- canvas .W ()/ 3 , canvas .H ()/ 2 , 0.5 , 0.5 )
332
+ shadow .Identity ()
333
+
334
+ backshadowimg = imaging .Blur (shadow .Image (), 8 )
335
+ }()
336
+
337
+ aw , ah := (ch - sch )/ 2 / 2 / 2 * 3 , (ch - sch )/ 2 / 2 / 2 * 3
338
+
339
+ go func () {
340
+ defer wg .Done ()
341
+ avatar , _ , err := image .Decode (bytes .NewReader (getAvatar ))
342
+ if err != nil {
343
+ return
344
+ }
345
+
346
+ isc := (ch - sch ) / 2 / 2 / 2 * 3 / float64 (avatar .Bounds ().Dy ())
347
+
348
+ scavatar := gg .NewContext (int (aw ), int (ah ))
349
+
350
+ scavatar .ScaleAbout (isc , isc , aw / 2 , ah / 2 )
351
+ scavatar .DrawImageAnchored (avatar , scavatar .W ()/ 2 , scavatar .H ()/ 2 , 0.5 , 0.5 )
352
+ scavatar .Identity ()
353
+
354
+ avatarimg = rendercard .Fillet (scavatar .Image (), 8 )
355
+ }()
356
+
357
+ err = canvas .ParseFontFace (fontdata , (ch - sch )/ 2 / 2 / 2 )
358
+ if err != nil {
359
+ return
360
+ }
361
+ namew , _ := canvas .MeasureString (a .nickname )
362
+
363
+ go func () {
364
+ defer wg .Done ()
365
+ avatarshadowimg = imaging .Blur (customrectangle (cw , ch , aw , ah , namew , color .Black ), 8 )
366
+ }()
367
+
368
+ go func () {
369
+ defer wg .Done ()
370
+ avatarbackimg = customrectangle (cw , ch , aw , ah , namew , colors [0 ])
371
+ }()
372
+
373
+ go func () {
374
+ defer wg .Done ()
375
+ whitetext , err = customtext (a , fontdata , cw , ch , aw , color .White )
376
+ if err != nil {
377
+ return
378
+ }
379
+ }()
380
+
381
+ go func () {
382
+ defer wg .Done ()
383
+ blacktext , err = customtext (a , fontdata , cw , ch , aw , color .Black )
384
+ if err != nil {
385
+ return
386
+ }
387
+ }()
388
+
389
+ wg .Wait ()
390
+ if scbackimg == nil || backshadowimg == nil || avatarimg == nil || avatarbackimg == nil || avatarshadowimg == nil || whitetext == nil || blacktext == nil {
391
+ err = errors .New ("图片渲染失败" )
392
+ return
393
+ }
394
+
395
+ canvas .DrawImageAnchored (blurback , canvas .W ()/ 2 , canvas .H ()/ 2 , 0.5 , 0.5 )
396
+
397
+ canvas .DrawImage (backshadowimg , 0 , 0 )
398
+
399
+ canvas .ScaleAbout (0.6 , 0.6 , cw - cw / 3 , ch / 2 )
400
+ canvas .DrawImageAnchored (scbackimg , canvas .W ()- canvas .W ()/ 3 , canvas .H ()/ 2 , 0.5 , 0.5 )
401
+ canvas .Identity ()
402
+
403
+ canvas .DrawImage (avatarshadowimg , 0 , 0 )
404
+ canvas .DrawImage (avatarbackimg , 0 , 0 )
405
+ canvas .DrawImageAnchored (avatarimg , int ((ch - sch )/ 2 / 2 ), int ((ch - sch )/ 2 / 2 ), 0.5 , 0.5 )
406
+
407
+ canvas .DrawImage (blacktext , 2 , 2 )
408
+ canvas .DrawImage (whitetext , 0 , 0 )
409
+
410
+ img = canvas .Image ()
411
+ return
412
+ }
413
+
414
+ func customrectangle (cw , ch , aw , ah , namew float64 , rtgcolor color.Color ) (img image.Image ) {
415
+ canvas := gg .NewContext (int (cw ), int (ch ))
416
+ sch := ch * 6 / 10
417
+ canvas .DrawRoundedRectangle ((ch - sch )/ 2 / 2 - aw / 2 - aw / 40 , (ch - sch )/ 2 / 2 - aw / 2 - ah / 40 , aw + aw / 40 * 2 , ah + ah / 40 * 2 , 8 )
418
+ canvas .SetColor (rtgcolor )
419
+ canvas .Fill ()
420
+ canvas .DrawRoundedRectangle ((ch - sch )/ 2 / 2 , (ch - sch )/ 2 / 2 - ah / 4 , aw / 2 + aw / 40 * 5 + namew , ah / 2 , 8 )
421
+ canvas .Fill ()
422
+
423
+ img = canvas .Image ()
424
+ return
425
+ }
426
+
427
+ func customtext (a * scdata , fontdata []byte , cw , ch , aw float64 , textcolor color.Color ) (img image.Image , err error ) {
428
+ canvas := gg .NewContext (int (cw ), int (ch ))
429
+ canvas .SetColor (textcolor )
430
+ scw , sch := cw * 6 / 10 , ch * 6 / 10
431
+ err = canvas .ParseFontFace (fontdata , (ch - sch )/ 2 / 2 / 2 )
432
+ if err != nil {
433
+ return
434
+ }
435
+ canvas .DrawStringAnchored (a .nickname , (ch - sch )/ 2 / 2 + aw / 2 + aw / 40 * 2 , (ch - sch )/ 2 / 2 , 0 , 0.5 )
436
+ err = canvas .ParseFontFace (fontdata , (ch - sch )/ 2 / 2 / 3 * 2 )
437
+ if err != nil {
438
+ return
439
+ }
440
+ canvas .DrawStringAnchored (time .Now ().Format ("2006/01/02" ), cw - cw / 6 , ch / 2 - sch / 2 - canvas .FontHeight (), 0.5 , 0.5 )
441
+
442
+ err = canvas .ParseFontFace (fontdata , (ch - sch )/ 2 / 2 / 2 )
443
+ if err != nil {
444
+ return
445
+ }
446
+ nextrankScore := 0
447
+ if a .rank < 10 {
448
+ nextrankScore = rankArray [a .rank + 1 ]
449
+ } else {
450
+ nextrankScore = SCOREMAX
451
+ }
452
+ nextLevelStyle := strconv .Itoa (a .level ) + "/" + strconv .Itoa (nextrankScore )
453
+
454
+ canvas .DrawStringAnchored ("Level " + strconv .Itoa (a .rank ), cw / 3 * 2 - scw / 2 , ch / 2 + sch / 2 + canvas .FontHeight (), 0 , 0.5 )
455
+ canvas .DrawStringAnchored (nextLevelStyle , cw / 3 * 2 + scw / 2 , ch / 2 + sch / 2 + canvas .FontHeight (), 1 , 0.5 )
456
+
457
+ err = canvas .ParseFontFace (fontdata , (ch - sch )/ 2 / 2 / 3 )
458
+ if err != nil {
459
+ return
460
+ }
461
+
462
+ canvas .DrawStringAnchored ("Create By ZeroBot-Plugin " + banner .Version , 0 + 4 , ch , 0 , - 0.5 )
463
+
464
+ err = canvas .ParseFontFace (fontdata , (ch - sch )/ 2 / 5 * 3 )
465
+ if err != nil {
466
+ return
467
+ }
468
+
469
+ tempfh := canvas .FontHeight ()
470
+
471
+ canvas .DrawStringAnchored (getHourWord (time .Now ()), ((cw - scw )- (cw / 3 - scw / 2 ))/ 8 , (ch - sch )/ 2 + sch / 4 , 0 , 0.5 )
472
+
473
+ err = canvas .ParseFontFace (fontdata , (ch - sch )/ 2 / 5 )
474
+ if err != nil {
475
+ return
476
+ }
477
+
478
+ canvas .DrawStringAnchored ("ATRI币 + " + strconv .Itoa (a .inc ), ((cw - scw )- (cw / 3 - scw / 2 ))/ 8 , (ch - sch )/ 2 + sch / 4 + tempfh , 0 , 0.5 )
479
+ canvas .DrawStringAnchored ("EXP + 1" , ((cw - scw )- (cw / 3 - scw / 2 ))/ 8 , (ch - sch )/ 2 + sch / 4 + tempfh + canvas .FontHeight (), 0 , 1 )
480
+
481
+ err = canvas .ParseFontFace (fontdata , (ch - sch )/ 2 / 4 )
482
+ if err != nil {
483
+ return
484
+ }
485
+
486
+ canvas .DrawStringAnchored ("你有 " + strconv .Itoa (a .score )+ " 枚ATRI币" , ((cw - scw )- (cw / 3 - scw / 2 ))/ 8 , (ch - sch )/ 2 + sch / 4 * 3 , 0 , 0.5 )
487
+
488
+ img = canvas .Image ()
489
+ return
490
+ }
0 commit comments