Flutter plugin for scanning and generating QR codes using the ZXing library, supporting Android, iOS, and desktop platforms
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
2.0 KiB

part of 'zxing.dart';
/// Reads barcode from String image path
Future<Code?> zxingReadBarcodeImagePathString(
String path, {
Params? params,
}) =>
zxingReadBarcodeImagePath(
XFile(path),
params: params,
);
/// Reads barcode from XFile image path
Future<Code?> zxingReadBarcodeImagePath(
XFile path, {
Params? params,
}) async {
final Uint8List imageBytes = await path.readAsBytes();
final imglib.Image? image = imglib.decodeImage(imageBytes);
if (image == null) {
return null;
}
return zxingReadBarcode(
image.getBytes(format: imglib.Format.luminance),
width: image.width,
height: image.height,
params: params,
);
}
/// Reads barcode from image url
Future<Code?> zxingReadBarcodeImageUrl(
String url, {
Params? params,
}) async {
final Uint8List imageBytes =
(await NetworkAssetBundle(Uri.parse(url)).load(url)).buffer.asUint8List();
final imglib.Image? image = imglib.decodeImage(imageBytes);
if (image == null) {
return null;
}
return zxingReadBarcode(
image.getBytes(format: imglib.Format.luminance),
width: image.width,
height: image.height,
params: params,
);
}
// Reads barcode from Uint8List image bytes
Code zxingReadBarcode(
Uint8List bytes, {
required int width,
required int height,
Params? params,
}) {
Code result = _readBarcode(bytes, width, height, params);
if (!result.isValid && params != null && params.tryInverted == true) {
// try to invert the image and read again
final Uint8List invertedBytes = invertImage(bytes);
result = _readBarcode(invertedBytes, width, height, params);
}
return result;
}
Code _readBarcode(
Uint8List bytes,
int width,
int height,
Params? params,
) =>
bindings
.readBarcode(
bytes.allocatePointer(),
params?.format ?? Format.any,
width,
height,
params?.cropWidth ?? 0,
params?.cropHeight ?? 0,
params?.tryHarder ?? false ? 1 : 0,
params?.tryRotate ?? true ? 1 : 0,
)
.toCode();