C# 如何在曲面视图中从摄影机捕获图像

C# 如何在曲面视图中从摄影机捕获图像,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;

嗨,我想在我的表面视图中放置一个“捕获按钮”,这样当我按下时,它应该捕获图像并将其保存在我的手机中。如果您看到my layout.xml,它有textview,可以在我的曲面视图上显示OCR文本,但我希望在按下捕获按钮后显示该textview。我是xamarin.android的新手,请帮帮我

layout.xml


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() { }
    }
}