anchor.diff:  class _ImageMatcher extends Matcher {
     final _expected;
   
  -  final _PixelData _expectedPixelData;
  +  final CanvasElement _expectedCanvas;
   
     final num _mismatchThreshold;
   
  
positive.code: 
      context.drawImage(value, 0, 0);
  
      final imageData = context.getImageData(0, 0, width, height);
      final data = new Uint8List.fromList(imageData.data);
  
      return new _PixelData(width, height, data);
    } else {
      throw new ArgumentError('Cannot resolve image data for the given value. '
          'Value must be a CanvasElement or an ImageElement or ImageData');
    }
  }
  
negative.code:   _ImageMatcher(expected,
        [this._mismatchThreshold = 0, this._rgbaThreshold = 0])
        : _expected = expected,
          _expectedCanvas = _resolveCanvas(expected);
  
    bool matches(item, Map matchState) {
      var canvas;
  
      try {
        canvas = _resolveCanvas(item);
      } catch (e) {
        return false;
      }
  
      final width = canvas.width;
      final height = canvas.height;
      final context = canvas.context2D;
      final imageData = context.getImageData(0, 0, width, height);
  
      if (width != _expectedCanvas.width) {
        return false;
      } else if (height != _expectedCanvas.height) {
        return false;
      } else {
        final data = imageData.data;
        final expectedData =
            _expectedCanvas.context2D.getImageData(0, 0, width, height).data;
        final pixelCount = width * height;
        final diffData = new Uint8ClampedList(width * height * 4);
        var mismatchCount = 0;
  
        for (var i = 0; i < height; i++) {
  