C# 如何在曲面视图中从摄影机捕获图像
嗨,我想在我的表面视图中放置一个“捕获按钮”,这样当我按下时,它应该捕获图像并将其保存在我的手机中。如果您看到my layout.xml,它有textview,可以在我的曲面视图上显示OCR文本,但我希望在按下捕获按钮后显示该textview。我是xamarin.android的新手,请帮帮我 layout.xmlC# 如何在曲面视图中从摄影机捕获图像,c#,xamarin.android,C#,Xamarin.android,嗨,我想在我的表面视图中放置一个“捕获按钮”,这样当我按下时,它应该捕获图像并将其保存在我的手机中。如果您看到my layout.xml,它有textview,可以在我的曲面视图上显示OCR文本,但我希望在按下捕获按钮后显示该textview。我是xamarin.android的新手,请帮帮我 layout.xml ACTIVITY.cs 使用Android.Runtime; 使用Android.Support.V4.App; 使用Android.Util; 使用Android.Views;
ACTIVITY.cs
使用Android.Runtime;
使用Android.Support.V4.App;
使用Android.Util;
使用Android.Views;
使用Android.Widget;
使用静态Android.Gms.Vision.Detector;
名称空间OCR_Pro
{
[活动(Label=“CameraActivity”)]
公共类CameraActivity:Activity、ISurfaceHolderCallback、IProcessor
{
私人水面观景摄像师;
私有文本视图txtView;
私人摄像源摄像源;
private const int RequestCameraPermissionID=1001;
public override void OnRequestPermissionsResult(int-requestCode,字符串[]权限,[GeneratedEnum]权限[]grantResults)
{
开关(请求代码)
{
案例请求CameraPermissionID:
{
if(grantResults[0]==权限.已授予)
{
cameraSource.Start(cameraView.Holder);
}
}
打破
}
}
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.CameraPage);
cameraView=findviewbyd(Resource.Id.surface\u视图);
txtView=findviewbyd(Resource.Id.txtView);
TextRecognizer txtRecognizer=新建TextRecognizer.Builder(ApplicationContext.Build();
if(!txtRecognitor.IsOperational)
{
Log.Error(“主要活动”,“探测器依赖项尚不可用”);
}
其他的
{
cameraSource=新建cameraSource.Builder(ApplicationContext,TXT识别器)
.SetFacing(摄像机定位。背面)
.SetRequestedPreviewSize(12801024)
.SetRequestedFps(2.0f)
.SetAutoFocusEnabled(true).Build();
cameraView.Holder.AddCallback(this);
txtRecognizer.SetProcessor(此);
}
}
public void SurfaceChanged(ISurfaceHolder holder,[GeneratedEnum]格式,整数宽度,整数高度){}
已处理的公共空隙表面(ISurfaceHolder)
{
if(ActivityCompat.CheckSelfPermission(ApplicationContext,Manifest.Permission.Camera)!=Android.Content.PM.Permission.grated)
{
//请求许可
ActivityCompat.RequestPermissions(此,新字符串[]){
Android.Manifest.Permission.Camera
},RequestCameraPermissionID);
返回;
}
cameraSource.Start(cameraView.Holder);
}
公共空隙表面置换(ISurfaceHolder)
{
cameraSource.Stop();
}
公共无效接收检测(检测)
{
SparseArray项目=检测。检测项目;
如果(items.Size()!=0)
{
txtView.Post(()=>{
StringBuilder strBuilder=新StringBuilder();
对于(int i=0;i
你可以试试CameraSource.TakePicture(IShutterCallback shutter,IPictureCallback jpeg)
,我会继续测试。@WendyZang谢谢你的回复,请发布一些示例代码,我将从中学习继续测试。我会尽快反馈。
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:id="@+id/txtview"
android:text="No Text"
android:textSize="20sp"
android:textColor="@android:color/white"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" />
</RelativeLayout>
using Android.Runtime;
using Android.Support.V4.App;
using Android.Util;
using Android.Views;
using Android.Widget;
using static Android.Gms.Vision.Detector;
namespace OCR_Pro
{
[Activity(Label = "CameraActivity")]
public class CameraActivity : Activity ,ISurfaceHolderCallback, IProcessor
{
private SurfaceView cameraView;
private TextView txtView;
private CameraSource cameraSource;
private const int RequestCameraPermissionID = 1001;
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
{
switch (requestCode)
{
case RequestCameraPermissionID:
{
if (grantResults[0] == Permission.Granted)
{
cameraSource.Start(cameraView.Holder);
}
}
break;
}
}
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.CameraPage);
cameraView = FindViewById<SurfaceView>(Resource.Id.surface_view);
txtView = FindViewById<TextView>(Resource.Id.txtview);
TextRecognizer txtRecognizer = new TextRecognizer.Builder(ApplicationContext).Build();
if (!txtRecognizer.IsOperational)
{
Log.Error("Main Activity", "Detector dependencies are not yet available");
}
else
{
cameraSource = new CameraSource.Builder(ApplicationContext, txtRecognizer)
.SetFacing(CameraFacing.Back)
.SetRequestedPreviewSize(1280, 1024)
.SetRequestedFps(2.0f)
.SetAutoFocusEnabled(true).Build();
cameraView.Holder.AddCallback(this);
txtRecognizer.SetProcessor(this);
}
}
public void SurfaceChanged(ISurfaceHolder holder, [GeneratedEnum] Format format, int width, int height) { }
public void SurfaceCreated(ISurfaceHolder holder)
{
if (ActivityCompat.CheckSelfPermission(ApplicationContext, Manifest.Permission.Camera) != Android.Content.PM.Permission.Granted)
{
//Request permission
ActivityCompat.RequestPermissions(this, new string[] {
Android.Manifest.Permission.Camera
}, RequestCameraPermissionID);
return;
}
cameraSource.Start(cameraView.Holder);
}
public void SurfaceDestroyed(ISurfaceHolder holder)
{
cameraSource.Stop();
}
public void ReceiveDetections(Detections detections)
{
SparseArray items = detections.DetectedItems;
if (items.Size() != 0)
{
txtView.Post(() => {
StringBuilder strBuilder = new StringBuilder();
for (int i = 0; i < items.Size(); ++i)
{
strBuilder.Append(((TextBlock)items.ValueAt(i)).Value);
strBuilder.Append("\n");
}
txtView.Text = strBuilder.ToString();
});
}
}
public void Release() { }
}
}