7

Hey Ich habe eine Windows Phone 8.1 App mit der Silverlight API. Ich lade dieses Bild von meinem Blobspeicher herunter.Erstellen von Imagebrush, Bitmap und Writeablebitmap von einer URL

Image to be downloaded

Das Bild von einem Link wie folgt kommt: https://[service].blob.core.windows.net/[imagename].png und das Bild kann in mehreren Browsern showned und heruntergeladen wird, sondern nur die URI.

ich jetzt diese verwenden als ImageBrush will auf der Grundlage der imageuri vom BlobStorage:

// If we have a returned SAS. 
       BitmapImage myOnlineImage = new BitmapImage(); 
       myOnlineImage.UriSource = new Uri(uploadImage.ImageUri, UriKind.RelativeOrAbsolute); 
       //ImageOnlineTest.Source = myOnlineImage; 
       var imageBrush = new ImageBrush 
       { 
        ImageSource = myOnlineImage, 
        Stretch = Stretch.None 
       }; 
       var source = FindChildShieldCanvas(CanvasImage, imageBrush); 

       WriteableBitmap wbm = new WriteableBitmap((BitmapImage)myOnlineImage); 
       ImageOnlineTest.Source = wbm; 

Die myOnlineImage nicht korrekt erstellt, zumindest kann ich das Bild auf eine writeablebitmapimage nicht konvertieren (eine Null-Ausnahme bekommen von der Konvertierung), und zusätzlich ist das Imagine leer, dh null. Aber soweit ich weiß, ist das der richtige Weg?

So basicly

Wie erstelle ich ein imagebrush basiert auf einer URL zu einer HTTPS-Site?

Antwort

4

Ich landete Lösung der Frage selbst:

Denken Sie daran, using System.Runtime.InteropServices.WindowsRuntime;

// If we have a returned SAS. 
       BitmapImage myOnlineImage = new BitmapImage(); 

       //myOnlineImage.UriSource = new Uri(uploadImage.ImageUri, UriKind.RelativeOrAbsolute); 
       using (var webCLient = new Windows.Web.Http.HttpClient()) 
       { 
        webCLient.DefaultRequestHeaders.Add("User-Agent", "bot"); 
        var responseStream = await webCLient.GetBufferAsync(new Uri(uploadImage.ImageUri, UriKind.RelativeOrAbsolute)); 
        var memoryStream = new MemoryStream();//responseStream.ToArrayAsStream().ReadAsync()); 

        memoryStream.Write(responseStream.ToArray(), 0, responseStream.ToArray().Length); 
        memoryStream.Position = 0; 
        myOnlineImage.SetSource(memoryStream); 

       } 
       //ImageOnlineTest.Source = myOnlineImage; 
       var imageBrush = new ImageBrush 
       { 
        ImageSource = myOnlineImage, 
        Stretch = Stretch.None 
       }; 
       var source = FindChildShieldCanvas(CanvasImage, imageBrush); 

       WriteableBitmap wbm = new WriteableBitmap((BitmapImage)myOnlineImage); 

Dieser Code funktioniert, hinzuzufügen, sowohl für die ImageBrush und Writeablebitmap

3

Um ein Bitmap aus einem Bild zu erstellen, müssen Sie vor der Einstellung der URL die Initialisierung des Bitmap-Objekts starten.

BitmapImage myOnlineImage = new BitmapImage(); 
    myOnlineImage.BeginInit(); 
    myOnlineImage.UriSource = new Uri(uploadImage.ImageUri, UriKind.RelativeOrAbsolute); 
    myOnlineImage.EndInit(); 

    var imageBrush = new ImageBrush 
    { 
     ImageSource = myOnlineImage, 
     Stretch = Stretch.None 
    }; 
    var source = FindChildShieldCanvas(CanvasImage, imageBrush); 

    WriteableBitmap wbm = new WriteableBitmap((BitmapImage)myOnlineImage); 
    ImageOnlineTest.Source = wbm; 
+0

Vielen Dank für Ihre Eingabe. Es scheint, als wäre 'BeginInit' und' EndInit' nicht auf Windows Phone 8.1 silverlight verfügbar? – JTIM

+0

Wenn Sie sich die Dokumentation ansehen, wird "BitmapImage ist nicht bereit für die Verwendung, bis ein ImageOpened-Ereignis ausgelöst wird". Es sieht zwar so aus, als wären Sie erfolgreich zur SetSource-Methode gewechselt. –

+0

Ich habe viele verschiedene Dinge versucht, wie zum Beispiel für das Ereignis zuhören, aber es schien nicht richtig zu funktionieren:/ – JTIM

1

Sie es mit C# tun können Ersetzen Sie auf diese Weise den entsprechenden Code durch Ihre Felder.

Rectangle rectangle = new Rectangle(); 
rectangle.StrokeThickness = 10; 
rectangle.Height = 200; 
rectangle.Width = 100; 
rectangle.SetValue(Canvas.LeftProperty, 100d); 
rectangle.SetValue(Canvas.TopProperty, 100d); 
rectangle.Fill = new ImageBrush(new BitmapImage(new Uri(@"C:\User\xiaorui.dong\Pictures\profile.jpeg"))); 
+0

Ja! Ähnliche Code Arbeitete für mich –

+0

Ich versuchte dies im Stern, aber ohne Erfolg. Meine Frage ist, ob dies innerhalb eines WP 8.1 Silverlight-Projekts gemacht wird oder welcher Projekttyp? – JTIM