【问题标题】:Xamarin: How to Capture Image DATA (not only for display) on portable appXamarin:如何在便携式应用程序上捕获图像数据(不仅用于显示)
【发布时间】:2017-05-11 06:30:40
【问题描述】:

我需要使用 xamarin.forms 便携版从我的相机中捕获图像,并获得对图像字节 [] 数据的访问权限以进行图像处理。

如何做到这一点?

我有工作代码,可以使用 xlabs 捕获图像并简单地显示它

public async Task<MediaFile> TakePicture()
    {
        Setup ();

        ImageSource = null;

        return await _Mediapicker.TakePhotoAsync (new CameraMediaStorageOptions {
            DefaultCamera = CameraDevice.Front, MaxPixelDimension = 400
        }).ContinueWith (t => {
            if (t.IsFaulted)
            {
                Status = t.Exception.InnerException.ToString();
            }
            else if (t.IsCanceled)
            {
                Status = "Canceled";
            }
            else
            {
                MediaFile mediaFile = t.Result;
                ImageSource = ImageSource.FromStream(() => mediaFile.Source);

                return mediaFile;
            }

            return null;
        }, _scheduler);
    }

    private async void buttonTakePicture_Clicked() {
        await cameraViewModel.TakePicture();
        imageView.Source = cameraViewModel.ImageSource;
    }

点击按钮会启动cameraViewModel.TakePicture(),然后使用 xlabs 在设备上实际拍照。

如何更改代码以同时提供图像原始数据(或完全使用不同的代码)?

谢谢

【问题讨论】:

    标签: mobile xamarin xamarin.forms cross-platform xlabs


    【解决方案1】:

    您可以使用mediaFile.Path 并将其作为 DependencyService 的参数传递:

    //For Android
    public byte[] ByteArrayFromStream(string path)
    {
        var bitmap = BitmapFactory.DecodeFile(path);
    
        byte[] bitmapData;
        using(stream = new MemoryStream())
        {
            bitmap.Compress(Bitmap.CompressFormat.Png, 100, stream);
            bitmapData = stream.ToArray();
        }
    
        return bitmapData;
    }
    
    //For iOS
    public byte[] ByteArrayFromStream(string path)
    {
        UIImage originalImage = UIImage.FromFile(path);
        return originalImage.AsPNG().ToArray();
    }
    

    要了解有关 DependencyService 的更多信息,您可以访问以下位置的文档: https://developer.xamarin.com/guides/xamarin-forms/dependency-service/

    【讨论】:

    • path 参数中应该给出什么?相机在哪里?
    • 您应该传递从相机插件获得的 MediaFile Path 属性MediaFile mediaFile = t.Result;
    【解决方案2】:

    这将帮助您在 PCL 中获取 byte[]:

    public async Task<MediaFile> TakePicture()
    {
        Setup ();
        ImageSource = null;
        return await _Mediapicker.TakePhotoAsync (new CameraMediaStorageOptions {
            DefaultCamera = CameraDevice.Front, MaxPixelDimension = 400
        }).ContinueWith (t => {
            if (t.IsFaulted)
            {
                Status = t.Exception.InnerException.ToString();
            }
            else if (t.IsCanceled)
            {
                Status = "Canceled";
            }
            else
            {
                MediaFile mediaFile = t.Result;
                using (MemoryStream ms = new MemoryStream())
                {
                    mediaFile.Source.CopyTo(ms);
                    byte[] attchmentbytes = ms.ToArray();
                }
                ImageSource = ImageSource.FromStream(() => mediaFile.Source);
                return mediaFile;
            }
            return null;
        }, _scheduler);
    }
    

    【讨论】:

    • 谢谢!您的解决方案是拍照,然后将图片数据复制到内存流,然后再复制到 byte[],还是引用内存中的数据,即相机拍摄的地方?我想知道数据被复制了多少次,以及是否有办法最小化这个数量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    相关资源
    最近更新 更多