Как я могу применить матричный фильтр к холсту? - PullRequest
0 голосов
/ 10 июля 2019

Я занимаюсь разработкой графического редактора с использованием среды Flutter и Dart, и я не могу применить матричный фильтр к холсту.

Я пытаюсь применить матричный фильтр к холсту, используя класс "Paint" и функцию "canvas.drawPaint (paint)", но получаю черный холст.

Исходное изображение

Ожидается (вариант 2 в коде)

Я получаю

class EditorPainter extends CustomPainter {

  final ui.Image image;
  final double zoom;
  final Offset offset;

  EditorPainter({
    @required this.image,
    @required this.zoom,
    @required this.offset,
    this.elements
  });

  @override
  void paint(Canvas canvas, Size size) {
    Size imageSize = Size(image.width.toDouble(), image.height.toDouble());
    Size targetSize = imageSize * zoom;

    // Variant 1 - not working (draws black canvas)

    paintImage(
      canvas: canvas,
      rect: offset & targetSize,
      image: image,
      fit: BoxFit.fill
    );


    // Paint with "sepia" filter
    final Paint paint = Paint()
      ..colorFilter = ColorFilter.matrix([
        0.393, 0.768, 0.189, 0.0, 0.0,
        0.349, 0.686, 0.168, 0.0, 0.0,
        0.272, 0.534, 0.131, 0.0, 0.0,
        0.0, 0.0, 0.0, 1.0, 0.0,
      ]);

    canvas.drawPaint(paint);

    // Variant 2 - working 
    // Image with "sepia" filter
    paintImage(
      canvas: canvas,
      rect: offset & targetSize,
      image: image,
      fit: BoxFit.fill,
      colorFilter: ColorFilter.matrix([
        0.393, 0.768, 0.189, 0.0, 0.0,
        0.349, 0.686, 0.168, 0.0, 0.0,
        0.272, 0.534, 0.131, 0.0, 0.0,
        0.0, 0.0, 0.0, 1.0, 0.0,
      ])
    );
  }
}

Я ожидаю получить холст с отфильтрованным изображением, но я получаю черный холст. Я пытался назначить BlendMode для Paint, но это не помогло.

...