• delphi fmx zxing原生不使用外部库二维码,条码扫描速度很快


    开源地址:GitHub - Spelt/ZXing.Delphi at QRCode

    ZXing.Delphi 是一个原生 Object Pascal 库,它基于众所周知的开源条形码库:ZXing(斑马线)。 该端口基于 ZXing 的 .Net Redth 端口和 Java 端口。 这是我认为的第一个原生 FireMonkey 条形码库。 它针对所有 FireMonkey 移动平台。

    使用这个库,您可以在不使用外部库链接的情况下以本机速度进行扫描,并避免兼容性问题和依赖性。 它很快。

    它与 Delphi XE7、XE8、10 Seattle 和 AppMethod 兼容,并通过 IOS 8.x、9.x 32/64bit、Windows 32/64 和 OSX 测试。 尚未在 Android 上对其进行测试,但这也应该可以。
    ZXing.Delphi 的目标是在您的 FireMonkey 或本机 Windows 应用程序中构建轻松、轻松、快速的条码扫描。 只需包含源文件或创建一个 .bpl 并将其添加到您现有的项目中,然后在您的项目中构建 ZXing.Delphi 源。

    delphi dx 10.2.3 android测试自带demo二维码扫描, 非常快

    //  FScanManager := TScanManager.Create(TBarcodeFormat.CODE_128, nil);
      FScanManager := TScanManager.Create(TBarcodeFormat.QR_CODE, nil);

    1,摄像头打开后,同步线程获取实时图像bitmap,然后zingx扫描图像中的二维码,

    返回TReadResult 结果

    2,如果扫描出结果,同步线程输出到memo1

    3,这里监听了app的一些消息,当到后台运行时摄像头关闭

     

    1. procedure TMainForm.CameraComponent1SampleBufferReady(Sender: TObject;
    2. const ATime: TMediaTime);
    3. begin
    4. TThread.Synchronize(TThread.CurrentThread, GetImage);
    5. end;
    6. procedure TMainForm.GetImage;
    7. var
    8. scanBitmap: TBitmap;
    9. ReadResult: TReadResult;
    10. begin
    11. CameraComponent1.SampleBufferToBitmap(imgCamera.Bitmap, True);
    12. if (FScanInProgress) then
    13. begin
    14. Exit;
    15. end;
    16. {
    17. inc(frameTake);
    18. if (frameTake mod 4 <> 0) then
    19. begin
    20. Exit;
    21. end;
    22. }
    23. scanBitmap := TBitmap.Create();
    24. scanBitmap.Assign(imgCamera.Bitmap);
    25. TTask.Run(
    26. procedure
    27. begin
    28. try
    29. FScanInProgress := True;
    30. scanBitmap.Assign(imgCamera.Bitmap);
    31. ReadResult := FScanManager.Scan(scanBitmap);
    32. FScanInProgress := False;
    33. except
    34. on E: Exception do
    35. begin
    36. FScanInProgress := False;
    37. TThread.Synchronize(nil,
    38. procedure
    39. begin
    40. // lblScanStatus.Text := E.Message;
    41. // lblScanResults.Text := '';
    42. end);
    43. if (scanBitmap <> nil) then
    44. begin
    45. scanBitmap.Free;
    46. end;
    47. Exit;
    48. end;
    49. end;
    50. TThread.Synchronize(nil,
    51. procedure
    52. begin
    53. if (length(lblScanStatus.Text) > 10) then
    54. begin
    55. lblScanStatus.Text := '*';
    56. end;
    57. lblScanStatus.Text := lblScanStatus.Text + '*';
    58. if (ReadResult <> nil) then
    59. begin
    60. memo1.Lines.Insert(0,ReadResult.Text);
    61. end;
    62. if (scanBitmap <> nil) then
    63. begin
    64. scanBitmap.Free;
    65. end;
    66. end);
    67. end);
    68. end;

  • 相关阅读:
    计算机毕业设计Java保险公司管理系统(源码+系统+mysql数据库+lw文档)
    Solr plugin热部署原理
    【语义分割】数据增强方法(原图与标签同时扩增)
    极端气候肆虐催化,碳中和带出了一个“再生时代”
    还在拼冗长的WhereIf吗?100行代码解放这个操作
    MobLink for Flutter
    通过ad18软件设计一个流量监测报警装置
    nginx必须使用域名访问的两种设置方法
    外包公司干了2个月,技术倒退两年...
    CRC碰撞概率 与CRC校验长度的理解
  • 原文地址:https://blog.csdn.net/y281252548/article/details/125636442