2014-03-19 11 views
9

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

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); 
} 
+1

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

+0

Code zum Erstellen einer neuen Datei hinzugefügt. – Dave

+0

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. –

3

Sie können auch Paul Betts Splat Bibliothek für Cross-Plattform rm Bild laden/speichern.

https://github.com/paulcbetts/splat

+0

Sieht gut aus, danke! – flo1411

+1

Sieht gut aus, hat aber keine Möglichkeit gefunden, Bilder plattformübergreifend zu speichern. Habt ihr Leute? – jzeferino

0

Um ein Bild zu nehmen und speichern Sie es mit Datum und Zeit darauf verwenden ich eine Kombination aus:

  1. Plugin.Media
  2. Plugin.Media.Abstractions
  3. PCLStorage
  4. 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); 
    } 
}