realContentImage method

Future<Image> realContentImage({
  1. Color ignoreColor = const Color(0xffffffff),
  2. bool includeIgnoreColor = false,
  3. double tolerance = 1,
  4. bool isDispose = false,
})

Get the real content in the image.

Implementation

Future<Image> realContentImage({
  Color ignoreColor = const Color(0xffffffff),
  bool includeIgnoreColor = false,
  double tolerance = 1,
  bool isDispose = false,
}) async {
  Completer<Image> completer = Completer();
  final ByteData? byteData =
      await toByteData(format: ImageByteFormat.rawRgba);
  if (byteData.isNull) {
    completer.complete(this);
  } else {
    final Uint32List uint32list = byteData!.buffer.asUint32List();
    late double minDx = -1;
    late double minDy = -1;
    late double maxDx = -1;
    late double maxDy = -1;
    bool isAssign = false;
    uint32list.iFor((index, element) {
      final bool isDiff = element.uInt32toColor
          .euclideanDistanceColorDifference(ignoreColor,
              tolerance: tolerance);
      if (isDiff) {
        final int dx = index % width;
        final int dy = index ~/ width;
        if (!isAssign) {
          isAssign = true;
          minDx = dx * 1;
          maxDx = dx * 1;
          minDy = dy * 1;
          maxDy = dy * 1;
        } else {
          minDx = min(dx * 1, minDx);
          minDy = min(dy * 1, minDy);
          maxDx = max(dx * 1, maxDx);
          maxDy = max(dy * 1, maxDy);
        }
      } else if (!includeIgnoreColor) {
        uint32list[index] = 0;
      }
    });
    final Offset start = Offset(minDx, minDy);
    final Size realSize = Size((maxDx - minDx), (maxDy - minDy));
    if (includeIgnoreColor) {
      final PictureRecorder recorder = PictureRecorder();
      final Canvas canvas = Canvas(recorder);
      canvas.drawImageRect(this, start & realSize, Offset.zero & realSize,
          Paint()..filterQuality = FilterQuality.high);
      completer.complete(recorder
          .endRecording()
          .toImageSync(realSize.width.toInt(), realSize.height.toInt()));
    } else {
      decodeImageFromPixels(
        uint32list.buffer.asUint8List(),
        width,
        height,
        PixelFormat.rgba8888,
        (Image result) {
          final PictureRecorder recorder = PictureRecorder();
          final Canvas canvas = Canvas(recorder);
          canvas.drawImageRect(
              result,
              start & realSize,
              Offset.zero & realSize,
              Paint()..filterQuality = FilterQuality.high);
          completer.complete(recorder
              .endRecording()
              .toImageSync(realSize.width.toInt(), realSize.height.toInt()));
        },
      );
    }
  }
  if (isDispose) dispose();
  return completer.future;
}