code: func AdjustFunc(img image.Image, fn func(c color.NRGBA) color.NRGBA) *image.NRGBA {
  	src := newScanner(img)
  	dst := image.NewNRGBA(image.Rect(0, 0, src.w, src.h))
  	parallel(0, src.h, func(ys <-chan int) {
  		for y := range ys {
  			i := y * dst.Stride
  			src.scan(0, y, src.w, y+1, dst.Pix[i:i+src.w*4])
  			for x := 0; x < src.w; x++ {
  				d := dst.Pix[i : i+4 : i+4]
  				r := d[0]
  				g := d[1]
  				b := d[2]
  				a := d[3]
  				c := fn(color.NRGBA{r, g, b, a})
  				d[0] = c.R
  				d[1] = c.G
  				d[2] = c.B
  				d[3] = c.A
  				i += 4
  			}
  		}
  	})
  	return dst
  }
docs: // AdjustFunc applies the fn function to each pixel of the img image and returns the adjusted image.
  //
  // Example:
  //
  //	dstImage = imaging.AdjustFunc(
  //		srcImage,
  //		func(c color.NRGBA) color.NRGBA {
  //			// Shift the red channel by 16.
  //			r := int(c.R) + 16
  //			if r > 255 {
  //				r = 255
  //			}
  //			return color.NRGBA{uint8(r), c.G, c.B, c.A}
  //		}
  //	)
  //