Bild aus dem Web in Image-Control anzeigen

  • WP8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Radinator.

    Bild aus dem Web in Image-Control anzeigen

    @Radinator Leider kann ich dir nicht vernünfig antworten über Email, ich hoffe du hast kein Problem damit dass wir die Frage ins Forum verlagern; dann können zudem auch Andere davon profitieren.

    Radinator schrieb:

    Ich hab eine Anwendung, die ganz billig auf ein PHP-Script mit einem HttpWebRequest zugreift und über GET Daten an das Script übergibt (Login-Daten). Falls der Benutzer gefunden wurde (User und PW), dann soll ein JSON serialisierte Zeile mit dem User zurück gegeben werden. In dem JSON befindet sich ein relativer Link zum Benutzerprofil des Users. Für Android hab ich es bereits geschafft, nur bei WinPhone hakt es noch.

    Du willst also einen String von einer URL laden, diesen als JSON interpretieren und dann nutzen?
    Gar kein Problem. Ich rate dir dazu die Bibliothek JSON.NET (newtonsoft.com/json, auch in NuGet) zu nutzen - auch wenn ich selbst damit noch nie gearbeitet hab, sie soll sehr gut sein.
    Es gibt auch eine eingebaute Lösung von MS; msdn.microsoft.com/en-us/library/bb412179(v=vs.110).aspx , Mit DataContracts. Ist sehr schön, aber nicht Anfängerfreundlich.

    Radinator schrieb:

    Da ich das ganze mit Xamarin mache, habe ich gehofft, dass es da eine möglichkeit gibt, das Bild in der Shared-Lib herunter zu laden und als Byte-Array zur Verfügung zu stellen. Anschließend kann ich dann plattformspezifisch aus dem Byte-Array das Bild wieder herstellen. Doch soweit ich das für WinPhone gefunden habe, kann ich dem Image als Source nur eine ImageSource geben, welches ich mit einer Uri "erzeuge". Nur leider beschäftigen sich alle Tutorials die irgendwie in diese Richtung gehen damit, das Bild aus dem lokalen "Assets" zu laden (eigentlich ja aus dem Ordner "Images", aber ich hab's jetzt ma Assets genannt).

    Mir ist nicht ganz klar, in welchem Format dein Bild ist. Sollte es in einem bekannten (JPEG, PNG... etc) sein, ist die Sache einfach:
    Du erstellst ein Image-Objekt, und gibst diesem ein BitmapSource-Object as Quelle, welches du wiederum mit einem UriSource-Object initialisierst.
    Wie das genau geht steht hier: stackoverflow.com/questions/18…he-url-link-from-database
    Im Hintergrund wird das Hild dann runtergeladen und angezeigt.
    Sollte das Bild als unformatierte Rohdaten vorliegen, kannst Du es als Byte-Array runterladen und dann von Hand in ein BitmapSource-Objekt konvertieren, aber glaub mir, wenn Du das vermeiden kannst, vermeide es.

    Weiterhin viel Erfolg!
    SᴛᴀʀGᴀᴛᴇ01

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „StarGate01“ ()

    Hallo @StarGate01!

    Danke dir für die Antwort :D

    StarGate01 schrieb:

    Ich rate dir dazu die Bibliothek JSON.NET
    JSON.NET war gleich das erste, was ich installiert habe ;D Dachte mir gleich, dass ich das brauchen werde.

    StarGate01 schrieb:

    Mir ist nicht ganz klar, in welchem Format dein Bild ist.
    Das Bild liegt auf dem gleichen Webserver, auf dem die Anwendung nachfrägt, in einem Unterverzeichnis als *.PNG-Datei vor.

    StarGate01 schrieb:

    Du erstellst ein Image-Objekt, und gibst diesem ein BitmapSource-Object as Quelle, welches du wiederum mit einem UriSource-Object initialisierst.
    Ok, dann war einer meiner Ansätze doch richtig. Ich hab den dann nur verworfen, da ich mir nicht sicher war, ob das wirklich sooo einfach war.

    StarGate01 schrieb:

    Sollte das Bild als unformatierte Rohdaten vorliegen, kannst Du es als Byte-Array runterladen und dann von Hand in ein BitmapSource-Objekt konvertieren
    Aber es ist prinzipiell möglich das ganze so zu machen oder? Geht darum, dass ich die Anwendung ja nicht nur auf WinPhone deployen will, sondern auch Android und iOS im Augenwinkel habe. Meine Hoffnung ist es halt, das Bild plattformunabhängig herunter zu laden und es dann als Byte-Array zur Verfügung zu stellen, so dass sich dann die iOS, die Android und die Window-Anwendung jeweils nur die GibBildVonServer-Methode aufrufen müssen, ein besagtes Byte-Array erhalten und sich dann das Bild selber bauen können.
    Aber ich werd mich noch ma umsehen, ob ich unter iOS und Android das ganze nicht auch über eine URI oder so machen kann.

    Danke nochmals!

    Lg Radinator

    Edit: Ich könnte doch noch mal deine Hilfe (oder auch die von jemand anderen) gebrauchen. Und zwar: Ich lad die PNG-Datei, wie in @StarGate01s Beitrag über Image, BitmapImage und Uri. Jedoch wird das Bild auf der Seite nicht angezeigt.
    Hier mal der C#-Code, den ich unter WinPhone verwende:
    Spoiler anzeigen

    C#-Quellcode

    1. protected override async void OnNavigatedTo(NavigationEventArgs e)
    2. {
    3. this.user = (User)e.Parameter;
    4. if (this.user != null)
    5. {
    6. string path = string.Format("{0}{1}{2}", DataService.Domain, DataService.REST, user.profile);
    7. Image image =
    8. await DataService.GibBitmapVonRESTService<Image>(path, (x) =>
    9. {
    10. Image result = new Image();
    11. BitmapImage bi = new BitmapImage();
    12. bi.UriSource = new Uri(path, UriKind.Absolute);
    13. result.Source = bi;
    14. return result;
    15. });
    16. this.lblNachname.Text = user.nname;
    17. this.lblVorname.Text = user.vname;
    18. this.profileImage = image;
    19. }
    20. }

    C#-Quellcode

    1. public static async Task<T> GibBitmapVonRESTService<T>(string path, Func<Stream, T> func)
    2. {
    3. T profile;
    4. using (Stream stream = await StreamVonRESTService(path))
    5. {
    6. profile = func(stream);
    7. }
    8. return profile;
    9. }
    10. public static async Task<Stream> StreamVonRESTService(string url)
    11. {
    12. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    13. var response = await request.GetResponseAsync();
    14. var stream = response.GetResponseStream();
    15. return stream;
    16. }



    Seltsamerweise, wenn ich das ganze unter Android mache, dann geht es wunderbar...
    Spoiler anzeigen

    C#-Quellcode

    1. protected async override void OnCreate(Bundle savedInstanceState)
    2. {
    3. base.OnCreate(savedInstanceState);
    4. SetContentView(Resource.Layout.UserView);
    5. InitActivity(); //Abspeichern der UI Elemente in Variablen
    6. string json = Intent.GetStringExtra("user");
    7. this.user = DataService.FromJsonToUser(json);
    8. string path = string.Format("{0}{1}{2}", DataService.Domain, DataService.REST, user.profile);
    9. this.profile =
    10. await DataService.GibBitmapVonRESTService<Bitmap>(path, (x) => BitmapFactory.DecodeStream(x));
    11. this.lblNachname.Text = user.nname;
    12. this.lblVorname.Text = user.vname;
    13. this.profileImage.SetImageBitmap(profile);
    14. }

    Für GibBitmapVonRESTService wird der selbe Code wie oben verwendet


    Wäre echt dankbar, wenn mir wer helfen könnte.
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Radinator“ ()

    In meiner Frage ging es ja auch ned darum das mit Xamarin.Forms zu machen, sondern es mit WinPhone APIs zu machen
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell