Ich suche nach einer Möglichkeit, Bilddateien in meinem lokalen Dateisystem unter Verwendung des pcl Speicherplugins in meinem Hauptprojekt für Windows Phone, Xamarin.Android und Xamarin.iOS zu speichern. Allerdings bietet das Plugin nur Methoden zum Schreiben von Text. Nichts über Bytes. Gibt es eine Möglichkeit, Byte-Arrays zu speichern?PCL Bilddatei in lokales Dateisystem speichern
9
A
Antwort
22
Wie wäre es etwa so:
IFile file = await FileSystem.Current.GetFileFromPathAsync(fs.filepath);
byte[] buffer = new byte[100];
using (System.IO.Stream stream = await file.OpenAsync(FileAccess.ReadAndWrite))
{
stream.Write(buffer, 0, 100);
}
Edit: Einige Code genommen von http://pclstorage.codeplex.com/
IFile file = await folder.CreateFileAsync("myfile.abc", CreationCollisionOption.ReplaceExisting);
Sobald Sie das IFile Objekt haben, sollten Sie dann in der Lage sein, dies zu verwenden, in der gleichen Weg:
IFile file = await folder.CreateFileAsync("myfile.abc", CreationCollisionOption.ReplaceExisting);
byte[] buffer = new byte[100];
using (System.IO.Stream stream = await file.OpenAsync(FileAccess.ReadAndWrite))
{
stream.Write(buffer, 0, 100);
}
3
Sie können auch Paul Betts Splat Bibliothek für Cross-Plattform rm Bild laden/speichern.
0
Um ein Bild zu nehmen und speichern Sie es mit Datum und Zeit darauf verwenden ich eine Kombination aus:
- Plugin.Media
- Plugin.Media.Abstractions
- PCLStorage
- SkiaSharp
Ich fand diese Using SkiaSharp, how to save a SKBitmap ? und verwendet es als Basis dafür:
// I get my bitmap from the camera (Plugin.Media allows to pick it from filesystem too)
var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
{
Directory = "MyFolder",
Name = "MyPic001",
PhotoSize = PhotoSize.Medium,
CompressionQuality = 40,
SaveToAlbum = true
});
// If succesfully taken...
if (file != null)
{
// Start using SkiaSharp to write text on it
var bitmap = SKBitmap.Decode(file.Path);
var canvas = new SKCanvas(bitmap);
var font = SKTypeface.FromFamilyName("Arial");
var brush = new SKPaint
{
Typeface = font,
TextSize = Convert.ToInt64(40),
IsAntialias = true,
Color = new SKColor(255, 255, 255, 255)
};
// Write on top of the image
canvas.DrawText(DateTime.Now.ToString("dd/MM/yyyy HH:mm"), 10, 60, brush);
var imageSK = SKImage.FromBitmap(bitmap);
// Get rootFolder and FileName from Plugin.Media's file.Path
string A = file.Path;
string P = A.Substring(0, A.LastIndexOf("/"));
string F = A.Substring(A.LastIndexOf("/") + 1, A.Length - (A.LastIndexOf("/") + 1));
// Start using PCLStorage
IFolder rootFolder = await FileSystem.Current.GetFolderFromPathAsync(P);
IFile myFile = await rootFolder.GetFileAsync(F);
// Use PCLStorage file opening to create an IO.Stream
using (Stream s = await myFile.OpenAsync(FileAccess.ReadAndWrite))
{
// Use SkiaSharp SKImage and SKData to Save the image+text on file.Path
SKData d = imageSK.Encode(SKEncodedImageFormat.Jpeg, 40);
d.SaveTo(s);
}
}
Diese recht später nützlich sein wird, um die Datei zu öffnen. Im Moment suche ich nach einer Möglichkeit, es tatsächlich zu schreiben. – flo1411
Code zum Erstellen einer neuen Datei hinzugefügt. – Dave
Ich habe Ihre Lösung versucht und es erstellt Dateien mit der gleichen Bytegröße, ich habe Bytegröße Byte [3500] angegeben, so dass alle Bilder mit 3500 Byte Größe erstellen, während die Größe der Bilder variiert. –