fix(drawlots): draw gif noise

This commit is contained in:
源文雨 2024-05-02 22:26:26 +09:00
parent c29b1238c2
commit 68fee3532b

View File

@ -5,8 +5,9 @@ import (
"bytes" "bytes"
"errors" "errors"
"image" "image"
"image/color" "image/draw"
"image/gif" "image/gif"
"io"
"math/rand" "math/rand"
"os" "os"
"strconv" "strconv"
@ -235,20 +236,41 @@ func randGif(gifName string) (image.Image, error) {
return nil, err return nil, err
} }
im, err := gif.DecodeAll(file) im, err := gif.DecodeAll(file)
if err != nil {
return nil, err
}
_, err = file.Seek(0, io.SeekStart)
if err != nil {
return nil, err
}
config, err := gif.DecodeConfig(file)
if err != nil {
return nil, err
}
_ = file.Close() _ = file.Close()
if err != nil { // https://zhuanlan.zhihu.com/p/27718135
return nil, err rect := image.Rect(0, 0, config.Width, config.Height)
if rect.Min == rect.Max {
var max image.Point
for _, frame := range im.Image {
maxF := frame.Bounds().Max
if max.X < maxF.X {
max.X = maxF.X
} }
/* if max.Y < maxF.Y {
firstImg, err := imgfactory.Load(name) max.Y = maxF.Y
if err != nil {
return nil, err
} }
v := im.Image[rand.Intn(len(im.Image))] }
return imgfactory.Size(firstImg, firstImg.Bounds().Dx(), firstImg.Bounds().Dy()).InsertUpC(v, 0, 0, firstImg.Bounds().Dx()/2, firstImg.Bounds().Dy()/2).Clone().Image(),err rect.Max = max
/*/ }
// 如果gif图片出现信息缺失请使用上面注释掉的代码把下面注释了(上面代码部分图存在bug) img := image.NewRGBA(rect)
v := im.Image[rand.Intn(len(im.Image))] b := rand.Intn(len(im.Image)) + 1
return imgfactory.NewFactoryBG(v.Rect.Dx(), v.Rect.Dy(), color.NRGBA{0, 0, 0, 255}).InsertUp(v, 0, 0, 0, 0).Clone().Image(), err a := 0
// */ if b > 8 {
a = b - 8
}
for _, srcimg := range im.Image[a:b] {
draw.Draw(img, srcimg.Bounds(), srcimg, srcimg.Rect.Min, draw.Src)
}
return img, err
} }