2014-10-10 17 views
7

Tôi đang sử dụng mẫu máy ảnh Xamarin.Forms từ đây - https://github.com/XForms/Xamarin-Forms-Labs-Samples/tree/master/XF.Labs.CameraSample Tôi có thể chọn hoặc chụp ảnh.Xamarin.Forms Chụp ảnh bằng camera hiển thị sai hướng và treo trên nút quay số

private async Task SelectPicture() 
{ 
    mediaPicker = DependencyService.Get<IMediaPicker>(); 
    imageSource = null; 
     var mediaFile = await mediaPicker.SelectPhotoAsync(new CameraMediaStorageOptions 
      { 
       DefaultCamera = CameraDevice.Front, 
       MaxPixelDimension = 400 
      }); 
     imageSource = ImageSource.FromStream(() => mediaFile.Source); 
     img.Source = imageSource; 

} 


private async Task TakePicture() 
{ 
    mediaPicker = DependencyService.Get<IMediaPicker>(); 
    imageSource = null; 
     var mediaFile = await mediaPicker.TakePhotoAsync(new CameraMediaStorageOptions 
      { 
       DefaultCamera = CameraDevice.Front, 
       MaxPixelDimension = 400 
      }); 
     imageSource = ImageSource.FromStream(() => mediaFile.Source); 
     img.Source = imageSource; 

} 

mã cho hình ảnh chỉ đơn giản là

img = new Image 
    { 
     BackgroundColor = Color.White, 
     Aspect = Aspect.AspectFit 
    };  

Có một vài vấn đề:

một đầu tiên. Bạn có thể chụp ảnh hoặc chọn ảnh đã lưu và sau đó sẽ hiển thị ảnh trên trang. Nếu bạn chọn ảnh, ảnh sẽ hiển thị chính xác, hoặc dọc hoặc ngang. Khi bạn chụp ảnh, ảnh sẽ chỉ hiển thị ở chế độ nằm ngang, vì vậy nếu ảnh được chụp theo chiều dọc, ảnh sẽ hiển thị ở bên cạnh. Đây không phải là thảm họa, nhưng nó sẽ là tốt hơn để hiển thị hình ảnh như thế nào nó đã được thực hiện.

Vấn đề thứ hai sẽ mạnh hơn một chút, nếu bạn nhấn nút quay lại của thiết bị khi bạn ở trong máy ảnh hoặc thư viện hình ảnh thì màn hình sẽ trống và sau đó bạn nhận được thông báo cho biết ứng dụng đã ngừng phản hồi.

Tôi chỉ thử tính năng này trên Android cho đến thời điểm này. Có ai có bất kỳ ý tưởng về cách tôi có thể giải quyết các vấn đề trên?

EDIT: Tôi đã cố gắng sửa chữa những tiếng ầm ầm vào nút quay lại, nhưng hình ảnh vẫn hiển thị ở thành của nó dành cho Android, nhưng hiển thị một cách chính xác cho iOS

+0

có ai giải quyết vấn đề này? –

+0

Tôi chưa có cơ hội dùng thử các giải pháp này, nhưng nó dường như chỉ là một vấn đề trên các thiết bị Samsung.Hoạt động tốt trên các thiết bị khác mà tôi đã thử nghiệm trên – user1667474

Trả lời

1

tôi sẽ liên đoán có một vài vấn đề ở đây. Một trình xử lý tiêm phụ thuộc Xamarin.Forms.Labs trên Android là 1) không kiểm tra vòng xoay cần thiết, 2) không kiểm tra lưu trữ bên ngoài hoặc không xử lý onActivityCancelled.

Giải pháp dễ dàng cho vấn đề của bạn là sử dụng Xamarin.Mobile Xamarin.Mobile Tôi không thể xác nhận 100% nó sẽ xử lý mọi thứ nhưng nếu nó thực hiện điều này sẽ là giải pháp nhanh chóng và dễ dàng.

Tùy chọn khó khăn hơn sẽ cung cấp cho bạn nhiều quyền kiểm soát hơn là cuộn triển khai cụ thể cho nền tảng của riêng bạn. Tôi sẽ không đi vào cách DI hoạt động hoặc bạn biết hoặc có thể thấy Accessing Native Features

Dưới đây là ví dụ về Android chụp ảnh với mã để tìm ra xem lưu trữ có ở bên ngoài hay không và có cần quay hay không.

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) 
    { 


     base.OnActivityResult(requestCode, resultCode, data); 
     //FinishActivity(requestCode); 
     try 
     { 

     if (resultCode == Result.Ok) 
     { 
      switch (requestCode) 
      { 
       case TAKE_PHOTO: 
        { 
         Java.IO.File photo = null; 

         if (isMounted) 
         { 

         photo = new Java.IO.File(Android.OS.Environment.ExternalStorageDirectory.ToString(), SharedLibrary.strPhotoLocation); 

         } 
         else 
         { 
         photo = new Java.IO.File(CacheDir, SharedLibrary.strPhotoLocation); 
         } 


         BitmapFactory.Options options = new BitmapFactory.Options(); 
         options.InJustDecodeBounds = true; 
         options.InSampleSize = 4; 
         options.InPurgeable = true; 
         options.InInputShareable = true;       

         try 
         { 
          //Cleanup code... removed this in favor of using options.InJustDecodeBounds to get info about the bitmap 
          //instead of creating it twice in memory 

          //Bitmap imageBitmap = BitmapFactory.DecodeFile(photo.AbsolutePath, options); 


          //int w = imageBitmap.Width; 
          //int h = imageBitmap.Height; 

          BitmapFactory.DecodeFile(photo.AbsolutePath, options); 
          int w = options.OutWidth; 
          int h = options.OutHeight; 

          Matrix matrix = new Matrix(); 
          matrix.SetRotate(getNeededRotation(photo.AbsolutePath)); 

          options.InJustDecodeBounds = false; 

          //Bitmap imageBitmap = Bitmap.CreateBitmap(BitmapFactory.DecodeFile(photo.AbsolutePath, options), 0, 0, w, h, matrix, false);              
          Bitmap imageBitmap = Bitmap.CreateScaledBitmap(BitmapFactory.DecodeFile(photo.AbsolutePath, options), w, h, false); 
          //... 

Nhận Mounted

 private System.Boolean isMounted 
    { 
     get 
     { 
      return  (System.Boolean)Android.OS.Environment.ExternalStorageState.Equals(Android.OS.Environment.MediaMounted); 
     } 
    }        

GetRotationNeeded

private int getNeededRotation(string filepath) 
    { 
     ExifInterface exif = new ExifInterface(filepath); 
     int orientation = exif.GetAttributeInt(ExifInterface.TagOrientation, -1); 
     int rotate = 0; 
     switch (orientation) 
     { 
      case 6: 
       { 
        rotate = 90; 
        break; 
       } 
      case 3: 
       { 
        rotate = 180; 
        break; 
       } 
      case 8: 
       { 
        rotate = 270; 
        break; 
       } 
      default: 
       { 
        rotate = 0; 
        break; 
       } 


     } 
     exif.Dispose(); 
     return rotate; 
    } 
1

bạn có thể kiểm tra định hướng cách nhau bởi dấu mediaFile.Exif.Orientation 'để kiểm tra xem đó là chân dung hoặc phong cảnh. ('TopLeft' -> Portrait.) Và sau đó đặt hướng ảnh trước khi lưu sử dụng,

mediaFile.Exif.Orientation = ExifLib.ExifOrientation.TopLeft;

+0

tính năng này không hoạt động với Xlab hiện tại. –

Các vấn đề liên quan