zoukankan      html  css  js  c++  java
  • Android实例-操作摄像头(XE8+小米2)

    结果:

    1.同样是照相,自己的程序设置为高质量时刷新慢,而小米手机的相机那真心反映快呀。

    2.就算我设置为最高质量,可相片也没有小米手机的相片大。我最大是2000*1000,而小米可以做到3000*2000,如果有人问我为什么都是整数,我会K你的。

    实例代码:

      1 unit Unit1;
      2 
      3 interface
      4 
      5 uses
      6   System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      7   FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
      8   FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, FMX.Media,
      9   FMX.Platform,//需要引入
     10   system.IOUtils,//需要引入
     11   FMX.Layouts;
     12 
     13 type
     14   TForm1 = class(TForm)
     15     Label1: TLabel;
     16     Image1: TImage;
     17     GroupBox1: TGroupBox;
     18     RadioButton1: TRadioButton;
     19     RadioButton2: TRadioButton;
     20     GroupBox2: TGroupBox;
     21     RadioButton3: TRadioButton;
     22     RadioButton4: TRadioButton;
     23     RadioButton5: TRadioButton;
     24     GroupBox3: TGroupBox;
     25     Button1: TButton;
     26     Button2: TButton;
     27     Button3: TButton;
     28     CameraComponent1: TCameraComponent;
     29     Timer1: TTimer;
     30     Layout1: TLayout;
     31     RadioButton6: TRadioButton;
     32     RadioButton7: TRadioButton;
     33     RadioButton8: TRadioButton;
     34     RadioButton9: TRadioButton;
     35     GroupBox4: TGroupBox;
     36     RadioButton10: TRadioButton;
     37     procedure FormCreate(Sender: TObject);
     38     procedure FormResize(Sender: TObject);
     39     procedure Timer1Timer(Sender: TObject);
     40     procedure RadioButton5Change(Sender: TObject);
     41     procedure RadioButton1Change(Sender: TObject);
     42     procedure RadioButton2Change(Sender: TObject);
     43     procedure RadioButton4Change(Sender: TObject);
     44     procedure RadioButton3Change(Sender: TObject);
     45     procedure Button1Click(Sender: TObject);
     46     procedure Button2Click(Sender: TObject);
     47     procedure Button3Click(Sender: TObject);
     48     procedure CameraComponent1SampleBufferReady(Sender: TObject;
     49       const ATime: TMediaTime);
     50     procedure RadioButton6Change(Sender: TObject);
     51     procedure RadioButton7Change(Sender: TObject);
     52     procedure RadioButton9Change(Sender: TObject);
     53     procedure RadioButton8Change(Sender: TObject);
     54     procedure RadioButton10Change(Sender: TObject);
     55   private
     56     //需要定义
     57     function AppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;
     58     procedure GetImage;
     59     { Private declarations }
     60   public
     61     { Public declarations }
     62   end;
     63 
     64 var
     65   Form1: TForm1;
     66 
     67 implementation
     68 
     69 {$R *.fmx}
     70 {$R *.NmXhdpiPh.fmx ANDROID}
     71 
     72 //程序事件处理
     73 function TForm1.AppEvent(AAppEvent: TApplicationEvent;
     74   AContext: TObject): Boolean;
     75 begin
     76   case AAppEvent of
     77     TApplicationEvent.aeWillBecomeInactive: // 当程序将要变为不活动时
     78       CameraComponent1.Active := False;
     79     TApplicationEvent.aeEnteredBackground: // 当程序进入后台时
     80       CameraComponent1.Active := False;
     81     TApplicationEvent.aeWillTerminate: // 当程序将要关闭时
     82       CameraComponent1.Active := False;
     83   end;
     84 end;
     85 
     86 //打开摄像头
     87 procedure TForm1.Button1Click(Sender: TObject);
     88 begin
     89   CameraComponent1.Active := True;
     90 end;
     91 
     92 //关闭摄像头
     93 procedure TForm1.Button2Click(Sender: TObject);
     94 begin
     95   CameraComponent1.Active := False;
     96 end;
     97 
     98 //保存照片
     99 procedure TForm1.Button3Click(Sender: TObject);
    100 begin
    101   Image1.Bitmap.SaveToFile(TPath.GetSharedCameraPath+'/temp.jpg');
    102   showmessage('保存成功!');
    103 end;
    104 
    105 //从摄像头那里取相片
    106 procedure TForm1.CameraComponent1SampleBufferReady(Sender: TObject;
    107   const ATime: TMediaTime);
    108 begin
    109   GetImage;
    110 end;
    111 
    112 procedure TForm1.FormCreate(Sender: TObject);
    113 var
    114   AppEventSvc: IFMXApplicationEventService;
    115 begin
    116   //启动一个服务,用来监控摄像头的状态
    117   if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(AppEventSvc)) then
    118     AppEventSvc.SetApplicationEventHandler(AppEvent); //AppEvent 为具做事的一个函数
    119   CameraComponent1.Quality := TVideoCaptureQuality.vcPhotoQuality;//设置图像质量
    120   //设置对焦方式
    121   CameraComponent1.FocusMode := TFocusMode.fmContinuousAutoFocus;
    122 end;
    123 
    124 procedure TForm1.FormResize(Sender: TObject);
    125 begin
    126   if Height < Width then //如果是横屏
    127     Image1.RotationAngle := 0;
    128   if Height > Width then //如果是竖屏
    129   if CameraComponent1.Kind = FMX.Media.TCameraKind.ckFrontCamera then//如果是前置摄像头
    130     Image1.RotationAngle := -90
    131   else
    132     Image1.RotationAngle := 90;
    133 end;
    134 
    135 //取相片
    136 procedure TForm1.GetImage;
    137 begin
    138   CameraComponent1.SampleBufferToBitmap(Image1.Bitmap, true);
    139 end;
    140 
    141 //选择摄像头
    142 procedure TForm1.RadioButton1Change(Sender: TObject);
    143 begin
    144   //选择后置摄像头
    145   CameraComponent1.Active := False;
    146   CameraComponent1.Kind := FMX.Media.TCameraKind.ckBackCamera;
    147   CameraComponent1.Active := True;
    148   // 后置时,图像要旋转 90 度,如果是竖屏的话
    149   if Height > Width then
    150   Image1.RotationAngle := 90;
    151 end;
    152 
    153 procedure TForm1.RadioButton2Change(Sender: TObject);
    154 begin
    155   //选择前置摄像头
    156   CameraComponent1.Active := False;
    157   CameraComponent1.Kind := FMX.Media.TCameraKind.ckFrontCamera;
    158   CameraComponent1.Active := True;
    159   //前置时,图像要旋转-90 度,如果是竖屏的话
    160   if Height > Width then
    161   Image1.RotationAngle := -90;
    162 end;
    163 
    164 //如果有闪光灯,打开, ,但在程序运行过程中,看不出什么效果
    165 procedure TForm1.RadioButton3Change(Sender: TObject);
    166 begin
    167   if CameraComponent1.HasFlash then
    168     CameraComponent1.FlashMode := FMX.Media.TFlashMode.fmFlashOn;
    169 end;
    170 
    171 //如果有闪光灯,关闭,但在程序运行过程中,看不出什么效果
    172 procedure TForm1.RadioButton4Change(Sender: TObject);
    173 begin
    174   if CameraComponent1.HasFlash then
    175     CameraComponent1.FlashMode := FMX.Media.TFlashMode.fmFlashOff;
    176 end;
    177 
    178 //将闪光灯设置为自动模式
    179 procedure TForm1.RadioButton5Change(Sender: TObject);
    180 begin
    181   if CameraComponent1.HasFlash then
    182     CameraComponent1.FlashMode := FMX.Media.TFlashMode.fmAutoFlash;
    183 end;
    184 
    185 //相片质量
    186 procedure TForm1.RadioButton6Change(Sender: TObject);
    187 begin
    188   CameraComponent1.Quality := TVideoCaptureQuality.PhotoQuality;
    189 end;
    190 
    191 //高质量
    192 procedure TForm1.RadioButton7Change(Sender: TObject);
    193 begin
    194   CameraComponent1.Quality := TVideoCaptureQuality.HighQuality;
    195 end;
    196 
    197 //中等质量
    198 procedure TForm1.RadioButton10Change(Sender: TObject);
    199 begin
    200   CameraComponent1.Quality := TVideoCaptureQuality.CaptureSettings;
    201 end;
    202 
    203 //低质量
    204 procedure TForm1.RadioButton8Change(Sender: TObject);
    205 begin
    206   CameraComponent1.Quality := TVideoCaptureQuality.MediumQuality;
    207 end;
    208 
    209 //捕捉设置
    210 procedure TForm1.RadioButton9Change(Sender: TObject);
    211 begin
    212   CameraComponent1.Quality := TVideoCaptureQuality.LowQuality;
    213 end;
    214 
    215 //刷新得到的摄像头的照片的显示
    216 procedure TForm1.Timer1Timer(Sender: TObject);
    217 begin
    218   Image1.Repaint;
    219 end;
    220 
    221 end.
  • 相关阅读:
    golang语言特性
    Mysql学习之order by的工作原理
    Mysql聚合函数count(*) 的性能分析
    Mysql的刷脏页问题
    普通索引与唯一索引的选择问题
    Mysql锁的类型与简析
    深入浅出Mysql索引
    Mysql修改语句的运行流程
    Mysql查询语句的运行流程
    Go语言入门之切片的概念
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/4786799.html
Copyright © 2011-2022 走看看