github.com/jmigpin/editor@v1.6.0/util/testutil/img.go (about) 1 package testutil 2 3 import ( 4 "fmt" 5 "image" 6 "image/color" 7 "image/draw" 8 "image/png" 9 10 //_ "image/gif" 11 _ "image/jpeg" 12 _ "image/png" 13 "os" 14 15 "golang.org/x/image/colornames" 16 ) 17 18 func OpenImage(filename string) (image.Image, string, error) { 19 f, err := os.Open(filename) 20 if err != nil { 21 panic(err) 22 } 23 defer f.Close() 24 return image.Decode(f) 25 } 26 27 //---------- 28 29 func ClearImg(img draw.Image) { 30 ClearImg2(img, colornames.Lightgray) 31 } 32 func ClearImg2(img draw.Image, c color.Color) { 33 r := img.Bounds() 34 src := image.NewUniform(c) 35 draw.DrawMask(img, r, src, image.Point{}, nil, image.Point{}, draw.Src) 36 } 37 38 func GenerateImg(r image.Rectangle, seed int) image.Image { 39 img := image.NewRGBA(r) 40 for y := 0; y < img.Bounds().Max.Y; y++ { 41 for x := 0; x < img.Bounds().Max.X; x++ { 42 v := byte(255 - seed*x*y) 43 c := color.RGBA{v, v, 0, 255} 44 img.Set(x, y, c) 45 } 46 } 47 return img 48 } 49 50 //---------- 51 52 func SPrintImg(img image.Image) string { 53 //b, _ := imageutil.EncodeToSixel(img) 54 //return string(b) 55 return "TODO:encodetosixel" 56 } 57 58 func SPrintImgs(imgs ...image.Image) string { 59 s := "" 60 for i, img := range imgs { 61 if i > 0 { 62 s += " " 63 } 64 s += SPrintImg(img) 65 } 66 return s 67 } 68 69 //---------- 70 71 func CompareImgs(img1, img2 image.Image) error { 72 if img1.Bounds() != img2.Bounds() { 73 return fmt.Errorf("bounds: %v %v", img1.Bounds(), img2.Bounds()) 74 } 75 b1 := img1.Bounds() 76 nFails := 0 77 firstFail := image.Point{} 78 for y := b1.Min.Y; y < b1.Max.Y; y++ { 79 for x := b1.Min.X; x < b1.Max.X; x++ { 80 c1 := color.RGBAModel.Convert(img1.At(x, y)) 81 c2 := color.RGBAModel.Convert(img2.At(x, y)) 82 if c1 != c2 { 83 nFails++ 84 if nFails == 1 { 85 firstFail = image.Point{x, y} 86 } 87 } 88 } 89 } 90 if nFails > 0 { 91 x, y := firstFail.X, firstFail.Y 92 c1 := color.RGBAModel.Convert(img1.At(x, y)) 93 c2 := color.RGBAModel.Convert(img2.At(x, y)) 94 return fmt.Errorf("colors: xy=(%v,%v): %v %v (nfails: %v)", x, y, c1, c2, nFails) 95 } 96 return nil 97 } 98 99 func CompareImgsOrSavePng(img1 image.Image, filename2 string) error { 100 f2, err := os.Open(filename2) 101 if err != nil { 102 if os.IsNotExist(err) { 103 // save image 104 f3, err := os.Create(filename2) 105 if err != nil { 106 return err 107 } 108 defer f3.Close() 109 if err := png.Encode(f3, img1); err != nil { 110 return err 111 } 112 return nil 113 } 114 return err 115 } 116 defer f2.Close() 117 img2, _, err := image.Decode(f2) 118 if err != nil { 119 return err 120 } 121 122 err = CompareImgs(img1, img2) 123 if err != nil { 124 return fmt.Errorf("%w:\ngot:\n%s\nexpected:\n%v", err, SPrintImg(img1), SPrintImg(img2)) 125 } 126 return nil 127 } 128 129 //---------- 130 131 func DrawPoint(img draw.Image, p image.Point, size int, c color.Color) { 132 r := image.Rect(p.X, p.Y, p.X+size, p.Y+size) 133 r2 := r.Intersect(img.Bounds()) 134 src := image.NewUniform(c) 135 draw.Draw(img, r2, src, image.Point{}, draw.Src) 136 }