Xamarin Android相机流

Nic*_*alo 2 c# camera android android-camera xamarin

我正在开发一个项目,我需要创建一个类似于SnapChat的应用程序,我在Visual Studio上使用Xamarin,我想创建一个带有屏幕底部按钮的Camera Stream.一旦用户触摸该圈子该应用程序将拍照!

Snapchat示例

我是xamarin的新手,所以我有很多问题.

1.)我在xamarin页面上关注这个例子:https://developer.xamarin.com/recipes/android/other_ux/textureview/display_a_stream_from_the_camera/

但是我不明白为什么相机流看起来很奇怪,如果手机处于垂直位置,显示的图像是水平的,反之亦然,当我移动手机时,显示的图像移动得非常慢,就好像它会做任何一种调整大小或什么的.

我怎样才能解决这个问题 ?

2.)我需要在应用程序中添加按钮,但代码中包含以下行:

SetContentView (_textureView);  
Run Code Online (Sandbox Code Playgroud)

所以我找到了这段代码:

public class Activity1 : Activity 
{
    bool _previewing;
    Camera _camera;
    TextureView _textureView;
    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);

        SetContentView(Resource.Layout.CameraLayout);
        Button button = FindViewById<Button>(Resource.Id.button1);
        _textureView = FindViewById<TextureView>(Resource.Id.textureView1);
        button.Click += delegate {
            try
            {
                if (!_previewing)
                {
                    _camera = Camera.Open();
                    _camera.SetPreviewTexture(_textureView.SurfaceTexture);
                    _camera.StartPreview();
                }
                else
                {
                    _camera.StopPreview();
                    _camera.Release();
                }
            }
            catch (Java.IO.IOException ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                _previewing = !_previewing;
            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

在这个问题上:Xamarin Android显示来自相机的流

但在该代码中,他们使用按钮来启用和禁用Stream,如何使用buttom将当前图像保存为位图?以及如何保持流始终运行?(当用户拍摄电影时执行)

3.)最后如何将按钮放在textureView上?你可以在我的快照聊天图片上看到.有可能实现吗?有可能在xamarin中做吗?

谢谢你的时间.

Gra*_*eng 5

但我不明白为什么相机流看起来很奇怪,如果手机处于垂直位置,显示的图像是水平的,反之亦然.

要解决此问题,您可以设置摄像机的显示方向,例如:

_camera = Android.Hardware.Camera.Open();

try
{
    _camera.SetPreviewTexture(surface);
    _camera.SetDisplayOrientation(90);
    _camera.StartPreview();
}
catch (Java.IO.IOException ex)
{
    Console.WriteLine(ex.Message);
}
Run Code Online (Sandbox Code Playgroud)

但在该代码中,他们使用按钮来启用和禁用Stream,如何使用buttom将当前图像保存为位图?

您可以设置一个PreviewCallback相机,然后在OnPreviewFrame您可以获得YuvImage当前预览.通常Bitmap这里没有必要,但如果你想将它转换为Bitmap,你可以参考这种情况下的答案:将预览帧转换为位图.

例如:

public class mPreviewCallback : Java.Lang.Object, IPreviewCallback
{
    public void OnPreviewFrame(byte[] data, Camera camera)
    {
        var paras = camera.GetParameters();
        var imageformat = paras.PreviewFormat;
        if (imageformat == Android.Graphics.ImageFormatType.Nv21)
        {
            Android.Graphics.YuvImage img = new Android.Graphics.YuvImage(data,
                imageformat, paras.PreviewSize.Width, paras.PreviewSize.Height, null);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并将此回调设置为您的相机,如下所示:

_camera.SetPreviewCallback(new mPreviewCallback());
Run Code Online (Sandbox Code Playgroud)

最后,如何将按钮放在textureView上?

您可以创建视图,例如:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextureView
        android:id="@+id/textureView"
        android:layout_height="match_parent"
        android:layout_width="match_parent" />

    <Button
        android:id="@+id/saveimg"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="img" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)