Mobile Xamarin:如何在便携应用程序上捕获图像数据(不仅仅是为了显示)

Mobile Xamarin:如何在便携应用程序上捕获图像数据(不仅仅是为了显示),mobile,xamarin,xamarin.forms,cross-platform,xlabs,Mobile,Xamarin,Xamarin.forms,Cross Platform,Xlabs,我需要使用xamarin.forms portable从相机中捕获图像,并获取图像字节[]数据的访问权限,以便进行图像处理 如何做到这一点 我有一个工作代码,可以捕获图像并使用xlabs简单地显示它 public async Task<MediaFile> TakePicture() { Setup (); ImageSource = null; return await _Mediapicker.TakePhotoAsyn

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

如何做到这一点

我有一个工作代码,可以捕获图像并使用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);
    }
单击该按钮将启动
cameraViewModel.TakePicture()
,它反过来使用xlabs在设备上实际拍摄照片

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


谢谢

您可以使用
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的更多信息,您可以访问以下位置的文档:

这将帮助您获取PCL中的字节[]:

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);
}
public异步任务TakePicture()
{
设置();
ImageSource=null;
return await_Mediapicker.TakePhotoAsync(新的摄像机播放机选项{
默认摄像头=CameraDevice.Front,MaxPixelDimension=400
}).ContinueWith(t=>{
如果(t.IsFaulted)
{
Status=t.Exception.InnerException.ToString();
}
否则,如果(t.IsCanceled)
{
Status=“已取消”;
}
其他的
{
MediaFile MediaFile=t.Result;
使用(MemoryStream ms=new MemoryStream())
{
mediaFile.Source.CopyTo(ms);
字节[]attchmentbytes=ms.ToArray();
}
ImageSource=ImageSource.FromStream(()=>mediaFile.Source);
返回媒体文件;
}
返回null;
}),;
}

路径参数中应该给出什么?相机在这里的位置是什么?您应该在
MediaFile MediaFile=t.Result处传递从相机插件获得的MediaFile Path属性谢谢!您的解决方案是先拍摄图片,然后将图片数据复制到内存流,然后再复制到字节[],还是引用相机拍摄的内存中的数据?我想知道数据被复制了多少次,以及是否有办法将复制量降至最低。
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);
}