Mobile Xamarin:如何在便携应用程序上捕获图像数据(不仅仅是为了显示)
我需要使用xamarin.forms portable从相机中捕获图像,并获取图像字节[]数据的访问权限,以便进行图像处理 如何做到这一点 我有一个工作代码,可以捕获图像并使用xlabs简单地显示它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
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);
}