2017-03-18 24 views
2

私はプロジェクトに取り組んでおり、SnapChatに似たアプリケーションを作成する必要があります。Visual StudioのXamarinで作業しています。画面の下部にボタン付きのカメラストリームを作成します。ユーザーがそのサークルをタッチすると、アプリは写真を撮ります。XamarinのAndroidカメラストリーム

Snapchat Example

私は質問の多くを持っているので、私はxamarinに新しいです。

1)私はxamarinページの例を以下した、https://developer.xamarin.com/recipes/android/other_ux/textureview/display_a_stream_from_the_camera/

が、私は電話が示す画像は、水平方向とその逆である垂直位置にある場合、カメラのストリームは、とても奇妙に見える理由を理解しません私が電話機を動かすときにも、画像は非常にゆっくりと動き、それはどんな種類のサイズ変更や何かをしているようなものです。

どうすればこの問題を解決できますか?

2)私はアプリにボタンを追加する必要がありますが、コード行を持っている:

SetContentView (_textureView); 

だから私はこのコードが見つかりました:この質問に

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; 
      } 
     }; 
    } 

Xamarin Android Display a stream from the camera

そのコードではボタンを使用してストリームを有効または無効にしますが、現在の画像をビットマップとして保存するにはどうすればよいですか?ストリームを常に稼働させ続けるにはどうすればいいですか? (ユーザーが写真を撮ったときにExept)

3.)最後にボタンをtextureViewの上に置くことはできますか?あなたが私のスナップチャット画像で見ることができるように。達成することは可能ですか?それはxamarinで行うことが可能ですか?

お時間をいただきありがとうございます。

答えて

5

しかし、なぜカメラのストリームが奇妙に見えているのか分かりません。電話機が垂直位置にある場合、画像は水平であり、逆も同様です。私がすることができます

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

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

をしかし、そのコードに彼らがどのように、ストリームを有効または無効にする]ボタンを使用します。

は、この問題を解決するには、例えば、カメラの表示方向を設定することができますButtomを使用して現在のイメージをビットマップとして保存しますか?

あなたのカメラにPreviewCallbackを設定することができ、その後、OnPreviewFrameに、あなたは現在のプレビューのYuvImageを得ることができます。通常はBitmapは必要ありませんが、Bitmapに変換する場合は、この場合はConverting preview frame to 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); 
     } 
    } 
} 

と、このようなあなたのカメラにこのコールバックを設定します。最後に、私はtextureView OVERボタンを置くことができますどのように

_camera.SetPreviewCallback(new mPreviewCallback()); 

あなたがこのような例のために、あなたのビューを作成することができます簡単です:

<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> 
関連する問題