Feedback

C# - Apps: Bilder speichern

Veröffentlicht von am 2/6/2015
(0 Bewertungen)
Hin- und wieder muss man auch in Apps Bilder speichern. Dieses Snippet bietet 2 Erweiterungsmethoden für RenderTargetBitmap und WritableBitmap. Die Methode für weitere Typen zu implementieren bringt nicht viel, da man an so gut wie keine Bildinformationen heran kommt wenn man nur die Basisklassen betrachtet.
Getestet sind die Methoden unter Windows 8.1, unter WP 8.1 existieren aber auch alle benötigten Methoden.

Benötigte Namespaces
System
System.Threading.Tasks
Windows.Graphics.Display
Windows.Graphics.Imaging
Windows.Storage
Windows.UI.Xaml.Media.Imaging
System.Runtime.InteropServices.WindowsRuntime
/// <summary>
/// Speichert das angegebene <see cref="Windows.UI.Xaml.Media.Imaging.RenderTargetBitmap"/> als Datei ab.
/// </summary>
/// <param name="image">Das zu speichernde Bild-Objekt.</param>
/// <param name="file">Die <see cref="Windows.Storage.IStorageFile"/> in der das Bild gespeichert werden soll.</param>
/// <returns>Eine Aufgabe, die die Speicherung des Bildes übernimmt.</returns>
public static async Task Save(this RenderTargetBitmap image, IStorageFile file)
{
    var rtb = image as RenderTargetBitmap;
    await Save((await rtb.GetPixelsAsync()).ToArray(), (uint)rtb.PixelWidth, (uint)rtb.PixelHeight, file);
}
/// <summary>
/// Speichert das angegebene <see cref="Windows.UI.Xaml.Media.Imaging.WriteableBitmap"/> als Datei ab.
/// </summary>
/// <param name="image">Das zu speichernde Bild-Objekt.</param>
/// <param name="file">Die <see cref="Windows.Storage.IStorageFile"/> in der das Bild gespeichert werden soll.</param>
/// <returns>Eine Aufgabe, die die Speicherung des Bildes übernimmt.</returns>
public static async Task Save(this WriteableBitmap image, IStorageFile file)
{
    var wb = image as WriteableBitmap;
    await Save(wb.PixelBuffer.ToArray(), (uint)wb.PixelWidth, (uint)wb.PixelHeight, file);
}

private static async Task Save(byte[] bytes, uint width, uint height, IStorageFile file)
{
    using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
    {
        var logicalDpi = DisplayInformation.GetForCurrentView().LogicalDpi;
        var encoder = await BitmapEncoder.CreateAsync(GetEncoderGuid(file), stream);
        encoder.SetPixelData(
            BitmapPixelFormat.Bgra8,
            BitmapAlphaMode.Ignore,
            width,
            height,
            logicalDpi,
            logicalDpi,
            bytes);
        await encoder.FlushAsync();
    }
}

private static Guid GetEncoderGuid(IStorageFile file)
{
    Guid fileType;
    switch (file.FileType.ToLower())
    {
        case ".dib":
        case ".bmp":
            fileType = BitmapEncoder.BmpEncoderId;
            break;
        case ".gif":
            fileType = BitmapEncoder.GifEncoderId;
            break;
        case ".jpg":
        case ".jpeg":
        case ".jif":
        case ".jfif":
        case ".jpe":
            fileType = BitmapEncoder.JpegEncoderId;
            break;
        case ".hdp":
        case ".jsr":
        case ".wdp":
            fileType = BitmapEncoder.JpegXREncoderId;
            break;
        case ".png":
            fileType = BitmapEncoder.PngEncoderId;
            break;
        case ".tif":
        case ".tiff":
            fileType = BitmapEncoder.TiffEncoderId;
            break;
        default:
            throw new ArgumentOutOfRangeException("Not supported file type.");
    }
    return fileType;
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!