realContentImage method
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;
}