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: 
    Description describeMismatch(
        item, Description mismatchDescription, Map matchState, bool verbose) {
      if (item is ImageElement ||
          item is CanvasElement ||
          item is ImageData ||
          item is String && item.startsWith('data:image')) {
        final canvas = _resolveCanvas(item);
  
        if (canvas.width != canvas.width) {
          return mismatchDescription.add('does not have the expected width.');
        } else if (canvas.height != canvas.height) {
          return mismatchDescription.add('does not have the expected width.');
        } else {
          final mismatchRatio = matchState['mismatchRatio'] ?? 0;
  
          return mismatchDescription
              .add('differs at ${mismatchRatio * 100}% of pixels.\n')
              .add('Expected image: ${_expectedCanvas.toDataUrl()}\n')
              .add('  Actual image: ${canvas.toDataUrl()}\n')
              .add('    Diff image: ${matchState['diff'].toDataUrl()}\n');
        }
      } else {
        return mismatchDescription
            .add('is not a canvas element, image element, image data, or a valid '
                'image data url');
      }
    }
  }
  
  CanvasElement _resolveCanvas(value) {
    if (value is ImageData) {
      final canvas = new CanvasElement(width: value.width, height: value.height);
      final context = canvas.context2D;
  
      context.putImageData(value, 0, 0);
  
      return canvas;
    } else if (value is CanvasElement) {
      final width = value.width;
      final height = value.height;
  
      if (value.context2D != null) {
        return value;
      } else {
        final canvas = new CanvasElement(width: width, height: height);
        final context = canvas.context2D;
  
        context.drawImage(value, 0, 0);
  
        return canvas;
      }
    } else if (value is ImageElement) {
      final width = value.naturalWidth;
  