- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用适用于 Android 的 firemonkey 在 Delphi 10.1 Berlin 中构建条形码阅读器应用程序。基于CameraComponent sample并使用 ZXing library , 可以读取条形码。
为了初始化相机,我使用了这段代码:
procedure TfrmMain.btnOpenReaderClick(Sender: TObject);
begin
CameraComponent.Active := False;
CameraComponent.FocusMode := FMX.Media.TFocusMode.ContinuousAutoFocus;
CameraComponent.Quality := TVideoCaptureQuality.MediumQuality;
CameraComponent.Active := True;
CameraComponent.SampleBufferToBitmap(imgCamera.Bitmap, True);
end;
为了扫描条形码,我正在运行这个:
procedure TfrmMain.GetImage;
var
ReadResult: TReadResult;
begin
CameraComponent.SampleBufferToBitmap(imgCamera.Bitmap, True);
if (FScanInProgress) then
Exit;
{ This code will take every 4 frames. }
inc(FFrameTake);
if (FFrameTake mod 4 <> 0) then
Exit;
ReadResult := nil;
ITask(TTask.Create(
procedure
begin
try
FScanInProgress := True;
ReadResult := FScanManager.Scan(imgCamera.Bitmap);
TThread.Synchronize(nil,
procedure
begin
try
if (ReadResult <> nil) then
begin
Label1.Text := ReadResult.text;
CameraComponent.Active := False;
end;
except
on E: Exception do
ShowMessage(E.Message);
end;
end);
finally
ReadResult.Free;
imgCamera.Bitmap.Free;
FScanInProgress := false;
end;
end)).Start;
end;
读取条码后,当我设置 CameraComponent.Active := True;
开始读取新条码时,CameraComponent 质量自动设置为高质量,即使该属性设置为中等启动组件时的质量。这会导致相机预览以低帧率显示。有没有办法在重新激活 CameraComponent 时将默认捕获设置设置为中等?
最佳答案
是的,您必须在激活相机之前对其进行设置。喜欢:
CameraComponent1.Quality := TVideoCaptureQuality.MediumQuality;
CameraComponent1.Active := true;
顺便说一句:我只在 Android 上停止相机,而不是在 IOS 上。那太慢了。我会在应用程序停止时用 IOS 关闭相机。 Canvas 不再更新。
procedure TdmGetBarcodeStatus.StopCamera();
begin
CameraIsActivated := false;
{$IFDEF ANDROID}
CameraComponent1.Active := false;
{$ENDIF}
end;
还在 Dave 提供的链接中实现相机优化技术。它极大地加快了相机帧速率。
我认为更好的扫描策略是您可以在连续任务中运行图像扫描进度。
这是可以做到的:
FParseImagesInProgress 是一个标志,它控制来自 TRectangle (RectImage.Fill.Bitmap.Bitmap) 的图像的解析。在停止相机之前,将 FParseImagesInProgress 设置为 false。
procedure TFormCamera.StartParseImageTaskService();
var
ReadResult: TReadResult;
begin
if FParseImagesInProgress then
Exit;
FParseImagesInProgress := true;
TTask.Run(
procedure
var
hints: TDictionary<TDecodeHintType, TObject>;
PossibleFormats: TList<TBarcodeFormat>;
ScanManager: TScanManager;
scanBitmap: TBitmap;
begin
PossibleFormats := TList<TBarcodeFormat>.Create();
PossibleFormats.Add(TBarcodeFormat.QR_CODE);
hints := TDictionary<TDecodeHintType, TObject>.Create();
hints.Add(TDecodeHintType.POSSIBLE_FORMATS, PossibleFormats);
ScanManager := TScanManager.Create(TBarcodeFormat.CODE_128, hints);
scanBitmap := TBitmap.Create();
try
while (FParseImagesInProgress) do
begin
ReadResult := nil;
try
TThread.Synchronize(nil,
procedure
begin
scanBitmap.Assign(RectImage.Fill.Bitmap.Bitmap);
end);
ReadResult := ScanManager.Scan(scanBitmap);
except
if Assigned(ReadResult) then
FreeAndNil(ReadResult);
end;
if Assigned(ReadResult) then
begin
TThread.Synchronize(nil,
procedure
begin
// PlaySound(TATSounds.Good);
MarkBarcode(ReadResult, TalphaColors.Deepskyblue);
if WasNotLastBarcodeInTimeWindow(ReadResult.Text) then
FBarcodeRequestManager.RequestBarcodeStatus(ReadResult.Text, HotMember, 'myDevice', HotUser,
HotPassword);
FLastBarcode := ReadResult.Text;
end);
FreeAndNil(ReadResult);
end;
Sleep(MS_BETWEEN_SCAN_FRAMES);
end; // while
finally
if Assigned(scanBitmap) then
scanBitmap := nil;
FreeAndNil(ScanManager);
if Assigned(PossibleFormats) then
begin
PossibleFormats.Clear;
PossibleFormats := nil;
end;
if Assigned(ReadResult) then
FreeAndNil(ReadResult);
end;
end); // end TTask
end;
真的很快。
无论如何,希望对您有所帮助!
关于android - 重新激活时 Firemonkey TCameraComponent 质量发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51830038/
如何使用 Firemonkey (XE6) 绘制贝塞尔曲线? XE6 wiki 中的文档目前有点稀疏。 最佳答案 以下代码可用于使用 Firemonkey XE6 绘制简单的贝塞尔曲线。创建一个新的
创建自定义 FireMonkey 样式时,您经常会遇到样式对象,例如 TButtonStyleObject,其中包含一个或多个属性(例如 TButtonStyleObject.NormalLink),
我正在努力让 FireMonkey TEdit 嵌套在 FireMonkey TPopup 中来接收键盘输入。桌面和移动项目都会发生这种情况,尽管我对后者感兴趣: 创建一个新的 FMX 项目。 向表单
我使用以下方法向 Treeviewitem 的复选框添加功能。 function TForm.CreateTVObj:TTreeviewItem; var MyCheckbox:TCheckbox
我有个问题。 我用这个简单的代码添加了一个按钮,但它没有编译任何解决方案? unit Unit1; interface uses System.SysUtils, System.Types, Syst
似乎我需要一个项目的帮助。 我有一个例程,该例程将运行时多个TabItem构造到firemonkey中的页面控件上,并且我想在该标签上有一个关闭按钮。 新选项卡上有一个复选框,用于从选项卡的样式器中加
这个问题在这里已经有了答案: How to free a component in Android / iOS (2 个回答) 7年前关闭。 为了灵 active ,不同的框架(如可见的“模块”,可以
我正在使用 Canvas 绘制函数drawrect和filltext在Tbitmap上绘制,但我不希望结果抗锯齿。有人知道该怎么做吗? 使用 OSX 和 Delphi XE3(但如果需要,可以使用 X
FireMonkey 中是否可以有可停靠的表单,因为我已经检查了表单属性,但没有这样的属性可以做到这一点。有什么解决方法可以实现这一点吗? 最佳答案 据我所知,没有内置任何内容,但您自己添加应该不会太
如果您希望 FireMonkey 中网格的同一列中存在不同的单元格控件,该怎么办?单元格控件似乎属于列,但在某些情况下(如属性编辑器),某些行需要复选框,而其他行需要组合框或编辑控件。 提前致谢。 最
我已将 ......\RAD Studio\9.0\Styles 中的几个示例样式作为资源加载到我的项目中,并且“简单地”尝试在运行时加载其中一个。 我正在使用以下代码来尝试执行此操作: var
在我的应用程序中,有一个文本字段,用户可以在其中输入他们的帐户电子邮件。 使用Java,我可以轻松地让 Android 键盘以小写字母开头 EditText text = new EditText(c
我目前正在尝试 Firemonkey 并遇到了这个问题。当我的申请中有多个表格时,我会得到相同数量的项目在我的 Windows 菜单栏中的一个应用程序(参见屏幕截图)。 在常规 VCL 应用程序中,只
我在 Delphi 中有一个程序,可以将图像组件从一个面板拖放到另一个面板,但在这里我对每个图像组件使用“TWincontrol”和“OnStartDrag”事件,并且效果很好,示例代码如下。当我在
我正在寻找一种在 firemonkey 应用程序中缓存全局热键的方法(仅限 Windows,至少目前如此)。经过一番挫折和谷歌搜索后,这应该可以工作:使用 winapi 调用注册热键 Register
Classic VCL question ...但是如何在 FireMonkey 中执行相同的操作? 我有几个标准的TControl,他们可以集中精力... 例如,在某些TEdit中,如果按返回键,我
我们从版本 1 开始就使用 Firemonkey,但仍然发现更新当前在屏幕上可见的组件很困难。在 Firemonkey 中请求重画的“方式”有很多,也许太多了: 应用样式(ApplyStyle 事件)
在 firemonkey 中,我尝试使用圆角矩形制作进度条。最简单的情况是一个矩形(进度条)和其中的第二个矩形(到目前为止的进度)。附上一个简单的例子。 带角的进度条(油漆): 我尝试过以下操作: 让
我正在使用 Delphi Seattle,我的应用程序适用于 Windows 桌面。 我正在尝试更改 TEdit 的字体大小。因此高度也被修改。在设计时一切正常,但当我运行应用程序时,TEdit 会忽
我目前正在尝试开发一个基于 Firemonkey 的项目。我使用 Firemonkey 是因为它的 UI 功能,因为该项目由许多较小的应用程序组成,每个应用程序都有 3D 方面。我目前仅使用 FMX
我是一名优秀的程序员,十分优秀!