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  }