在上一篇文章中,详细说明了使用DELPHI 11在VCL和FMX模式下,如何根据文本内容生成二维码。
在此文中,我们一起来探讨一下如何通过DELPHI 11实现二维码的扫描
主要步聚说明:
1.下载ZXing库
2.安装ZXing库
3.创建实例实现扫描功能
废话不多说,直接进入主题
【下载ZXing库】
此库在GitCode网站上可以下载,但我失败了很多次才成功,而且下载以后还要稍微修改一下,我把修改后的成品重新上传了一下,地址如下:
【安装ZXing库】
为了照顾新人,我把安装的具体步骤也进行说明
第一步:打开DELPHI 11,并新建Packgge
第二步:按下图操作
第三步:选择下载的ZXing库路径,并按Ctrl + A进行全选,并导入
导入成功后可以看到文件清单内容
第四步:点击红框位置按右键,选择安装
安装过程中所有提示框全部按OK就可以,直到提示安装成功,那么ZXing库就成功完成了安装
第五步:增加搜索路径,否则无法引用库单元
点击红框标识的文件夹图标,将下载的ZXing库文件路径加入进来后,点ADD。重点注意:下面红框位置的每一个都要按上面的路径设定一次
至此为止,我们的库才算是全部安装完成,可以在DELPHI 中正常引用了
我们可以随便打开一个新的工程测试一下,点击到单元文件中,输入“ZXing”
就可以看到所有的单元提示,这说明库文件引用成功
【创建扫码实例】
下面我们通过一个简单的实例的来调用ZXing库,并在安卓手机上实现扫描功能
首先我们新建一个工程,并在界面上放上Image1,Memo1,Button1,CameraComponent1,大概的界面如下图所示
此实例功能比较简单,主要分为两个部分
1.因为要使用相机,所以要申请相机使用权限
2.打开相机,识别条码,并将条码内容显示在MEMO1中
【申请相机权限】
先设置一个变量
private
{ Private declarations }
fPermissionCamera: String;
并且需要引用以下单元
Uses
zxing.BarcodeFormat,
zxing.ScanManager,
zxing.ReadResult,
system.Permissions,
androidapi.Jni.Os,
androidapi.Helpers;
整个代码如下所示:
unit Unit2;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,zxing.BarcodeFormat,zxing.ScanManager,zxing.ReadResult,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Memo.Types,fmx.Media,system.Permissions,fmx.DialogService,fmx.Platform,
FMX.Objects, FMX.StdCtrls, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo,androidapi.Jni.Os,androidapi.Helpers;
type
TForm2 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Image1: TImage;
CameraComponent1: TCameraComponent;
procedure Button1Click(Sender: TObject);
procedure CameraPermissionRequestResult(Sender: TObject;
const APermissions: TClassicStringDynArray;
const AGrantResults: TClassicPermissionStatusDynArray);
procedure ExplainReason(Sender: TObject; const APermissions: TClassicStringDynArray;
const APostRationaleProc: TProc);
procedure FormCreate(Sender: TObject);
procedure CameraComponent1SampleBufferReady(Sender: TObject;
const ATime: TMediaTime);
private
{ Private declarations }
fPermissionCamera: String;
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.fmx}
procedure TForm2.CameraPermissionRequestResult(Sender: TObject;
const APermissions: TClassicStringDynArray;
const AGrantResults: TClassicPermissionStatusDynArray);
begin
if (Length(AGrantResults) = 1) and
(AGrantResults[0] = TPermissionStatus.Granted) then
begin
CameraComponent1.Active := false;
CameraComponent1.Quality := FMX.Media.TVideoCaptureQuality.HighQuality;
CameraComponent1.Kind := FMX.Media.TCameraKind.BackCamera;
CameraComponent1.FocusMode := FMX.Media.TFocusMode.ContinuousAutoFocus;
CameraComponent1.Active := True;
Memo1.Lines.Clear;
end
else
TDialogService.ShowMessage('相机使用未授权,无法扫描条码')
end;
procedure TForm2.ExplainReason(Sender: TObject;
const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc);
begin
TDialogService.ShowMessage('软件需要相机使用权限来扫描条码',
procedure(const AResult: TModalResult)
begin
APostRationaleProc;
end)
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
fPermissionCamera := JStringToString(TJManifest_permission.JavaClass.CAMERA);
end;
procedure TForm2.CameraComponent1SampleBufferReady(Sender: TObject;
const ATime: TMediaTime);
begin
TThread.Synchronize(TThread.CurrentThread,
procedure
begin
CameraComponent1.SampleBufferToBitmap(Image1.Bitmap, True);
end);
end;
procedure TForm2.Button1Click(Sender: TObject);
var
ReadResult:TReadResult;
SCanManager:TScanManager;
begin
PermissionsService.RequestPermissions([fPermissionCamera],
CameraPermissionRequestResult, ExplainReason);
SCanManager:=TScanManager.Create(TBarcodeFormat.Auto,nil);
ReadResult:=SCanManager.Scan(Image1.Bitmap);
if ReadResult <> nil then
begin
Memo1.Text:=ReadResult.text;
end;
end;
end.
然后我们编译运行,试试功能怎么样
完美识别二维码,并将信息传给了MEMO1
当然这只是最简单的例子,只是演示一下如何识别条码,更多的条码处理功能,比如优化,提速等需要在后面继续。
怎么样,是不是很简单,够不够详细,有句话怎么说来的?能给新人看懂的教程才是好教程,自我陶醉结束,文章介绍结束,当然学习和分享没有结束
欲知后事如何,请听下回分解。