我是移动开发新手,最近观看了有关使用 Camera.MAUI 拍照的教程视频 - https://www.youtube.com/watch?v=nlZSLPf22vI 。我有一个项目需要捕获照片然后将其保存到 mssql 数据库,我已经有一个使用字节数据类型保存图像详细信息的 API,并且我可以将其连接到我的 maui 应用程序。
我的问题是,我不知道如何保存拍摄的照片。
下面是我的初始代码:
<VerticalStackLayout
Spacing="25"
Padding="30,0"
VerticalOptions="Fill"
HorizontalOptions="Fill">
<cv:CameraView x:Name="cameraView" WidthRequest="300" HeightRequest="300" Cameras ="{Binding ViewCameraCommand}"/>
<Button Text="Smile!" Command="{Binding CapturePhotoCommand}"/>
<Image Source="{Binding ImgSrc}" WidthRequest="200" HeightRequest="200" />
<Button Margin="20" Text="Save Photo" Command="{Binding SavePhotoCommand}"/>
</VerticalStackLayout>
[ObservableProperty] public int _imgId;
[ObservableProperty] public string _imgName;
[ObservableProperty] public string _imgData;
[ObservableProperty] public string _loc;
[ObservableProperty] public string _owner;
[ObservableProperty] public byte[] _imgView;
[ObservableProperty] public string _imgType;
[ObservableProperty] public CameraView _cameraView;
[ObservableProperty] ImageSource _imgSrc;
IPhotoDataService photoDataService;
public HomeViewModel(IPhotoDataService photoDataService)
{
this.photoDataService = photoDataService;
}
[RelayCommand]
async Task Tap()
{
//TODO: refresh page without details
await Shell.Current.GoToAsync("//LoginPage");
}
[RelayCommand]
async Task SavePhoto()
{
try
{
var addPhoto = new PhotoModel
{
ImageId = ImgId,
ImageName = ImgName,
ImageData = ImgData,
Location = Loc,
User = Owner,
ImageType = ImgType,
//ImageView = ImgView,
};
Debug.WriteLine("---> Add New Item");
await photoDataService.AddPhotoAsync(addPhoto);
await Shell.Current.DisplayAlert("Information", "Successfully addded", "Ok");
}
catch (Exception ex)
{
await Shell.Current.DisplayAlert("Error", ex.Message, "Ok");
}
}
[RelayCommand]
async Task ViewCamera()
{
CameraView.Camera = CameraView.Cameras.First();
MainThread.BeginInvokeOnMainThread(async () =>
{
await CameraView.StopCameraAsync();
await CameraView.StartCameraAsync();
});
}
[RelayCommand]
async Task CapturePhoto()
{
ImgSrc = CameraView.GetSnapShot(Camera.MAUI.ImageFormat.PNG);
}
我的问题是,我不知道如何保存拍摄的照片。
建议您使用照片和视频媒体选择器来实现此功能。 IMediaPicker 界面允许用户在设备上选择或拍摄照片或视频。
我们可以调用 CapturePhotoAsync 方法来打开相机并让用户拍照。如果用户拍照,该方法的返回值将是一个非空值。
以下代码示例使用媒体选择器拍摄照片并将其保存到缓存目录:
public async void TakePhoto()
{
if (MediaPicker.Default.IsCaptureSupported)
{
FileResult photo = await MediaPicker.Default.CapturePhotoAsync();
if (photo != null)
{
// save the file into local storage
string localFilePath = Path.Combine(FileSystem.CacheDirectory, photo.FileName);
using Stream sourceStream = await photo.OpenReadAsync();
using FileStream localFileStream = File.OpenWrite(localFilePath);
await sourceStream.CopyToAsync(localFileStream);
}
}
}
从上述文档中提到的提示,我们可以知道:
属性并不总是返回物理路径 文件。要获取文件,请使用FullPath
方法。OpenReadAsync