c# - 根据 Xam.Plugin.Media 拍摄的图片创建图库
问题描述
我在 Xamarin.forms 和 c# 和应用程序开发中有点新。目前我正在开发一个可以拍照的应用程序,然后你可以将它们发送到服务器,这样你就可以在 WebApp 上检查它们。我正在使用 Xamarin.Forms。
问题是我正在疯狂地尝试用你拍的照片创建一个画廊。有点像以“无限滚动视图 + 2x2 网格”的方式显示保存在系统文件夹(不是设备的默认图库)中的图片。
如果有人能指出我正确的方向或给我一个提示、链接、示例等,我将非常感激!><
我的 XAML 非常简单:
<ScrollView>
<StackLayout
Margin="20">
<Image
x:Name="PhotoImage" />
<StackLayout
Orientation="Horizontal" >
<Button
x:Name="CameraButton"
BackgroundColor="#95c241"
Text="Foto aufnehmen"
TextColor="White"
Clicked="CameraButton_Clicked"
HorizontalOptions="Start"
/>
<!--<Button
x:Name="selectimagebutton"
BackgroundColor="#4ab8ae"
Clicked="selectimagebutton_clicked"
Text="aus der gallerie"
TextColor="white"
HorizontalOptions="endandexpand"
/>-->
<Button
x:Name="SyncButton"
BackgroundColor="#95c241"
Clicked="SyncButton_Clicked"
Text="Synchronisierung"
TextColor="White"
HorizontalOptions="EndAndExpand" />
</StackLayout>
我的 MainPage.xampl.cs。我抽了很多次,不知道对你有没有帮助:
//Camera Logic
public async Task<bool> CheckPhotoPermissionsAsync()
{
var cameraStatus = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Camera);
var storageStatus = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Storage);
if (cameraStatus != PermissionStatus.Granted || storageStatus != PermissionStatus.Granted)
{
var results = await CrossPermissions.Current.RequestPermissionsAsync(new[] { Permission.Camera, Permission.Storage });
cameraStatus = results[Permission.Camera];
storageStatus = results[Permission.Storage];
}
return cameraStatus == PermissionStatus.Granted || storageStatus == PermissionStatus.Granted;
}
private async void CameraButton_Clicked(object sender, EventArgs e)
{
//Toma la foto y la muestra directamente en la pagina
//Macht ein Foto und zeigt es auf diese Seite
bool photoPermissions = await CheckPhotoPermissionsAsync();
if (!photoPermissions)
{
await DisplayAlert("Achtung!", "Damit die App einwandfrei läuft, mussen Sie den Zulassungen zustimmen", "ok");
return;
}
else
{
await CrossMedia.Current.Initialize();
if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
//If camera option not available
//Falls das Handy keine Kamera hat
await DisplayAlert("Hmmm...!", "Das Gerät hat kein Zugriff auf die Kamera...", "ok");
return;
}
var mediaFile = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
{
SaveToAlbum = false,
//Directory = "FotoApp_Folder",
Name = fileName(),
PhotoSize = PhotoSize.Custom,
//SaveMetaData = false,
//Nurr bei PhotoSize.Custom
CustomPhotoSize = 20,
CompressionQuality = 70,
//Only for iOS
AllowCropping = true
});
//var mediaFile = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
//{
// SaveToAlbum = false,
//});
//await saveScaleAsync(mediaFile);
//Debug.WriteLine("It work baby! The mediaFile is: " + mediaFile);
await saveMediaFile(mediaFile);
var x = ImageSource.FromStream(() =>
{
var stream = mediaFile.GetStream();
//mediaFile.Dispose();
return stream;
});
Debug.WriteLine("It works baby! The mediaFile is: " + mediaFile);
//await ToBase64(mediaFile);
}
}
private async Task saveMediaFile(MediaFile mediaFile)
{
if (mediaFile == null)
{
//Falls kein Bild vorhanden ist
await DisplayAlert("Ups!", "Es gibt kein Bild vorhanden", "ok");
return;
}
try
{
var xxx = mediaFile.Path;
//PhotoTable ist eine Klasse in diesem Fall , die die Attribute vom DB hat.
var s = new PhotoTable
{
Filename = mediaFile.Path,
Created_At = DateTime.Now,
Sync_At = null
};
await HelperDB.Instance.conn.InsertAsync(s);
PhotoImage.Source = ImageSource.FromStream(() => mediaFile.GetStream());
}
catch (Exception ee)
{
//Falls was nicht mit dem DB klappt....
await DisplayAlert("Ups!", "Bitte versuchen Sie das nochmal. Es gab ein problem mit dem DB" + ee.ToString(), "ok");
}
updateText();
}
public string fileName()
{
DateTime d = DateTime.Now;
string fileName = $"IMAGE_{d.ToString("yyyyMMdd_HHmmss")}_.jpg";
return fileName;
}
解决方案
推荐阅读
- python - 使用 pdf2image 将 PDF 转换为图像不起作用
- gradle - 如何将子项目生成的类添加到 Gradle 中 WAR 文件的 WEB-INF/classes 目录
- android - 长度过滤器不适用于 textview ?- 安卓
- typescript - api 数据验证的最佳实践
- python - 在 Python Clicker 游戏中每秒添加硬币
- amazon-web-services - 使用 AWS cli 所需的 Amazon EMR 集群详细信息
- python - 在元数据之后检测 CSV 的开头
- reactjs - 从子组件访问 NextJs Link href 属性
- mysql - 这个查询不好吗?MySql 一对多与左连接和嵌套查询
- python - 如何使子进程在服务关闭后幸存下来?