Laden...

Bild wird nur bei relativen Pfad angezeigt, ein absoluter Pfad zeigt das Bild nicht an

Erstellt von michlG vor 14 Jahren Letzter Beitrag vor 7 Jahren 8.821 Views
michlG Themenstarter:in
3.430 Beiträge seit 2007
vor 14 Jahren
Bild wird nur bei relativen Pfad angezeigt, ein absoluter Pfad zeigt das Bild nicht an

Hallo Leute,

ich muss jetzt wieder einmal eine Kleinigkeit an meinem C# Projekt anpassen und bin dabei leider auf ein sehr komisches Problem gestossen.

Also ich habe eine DLL die bestimmte Controls enthält.
Dabei will ich bei einem dieser Controls ein Bild (von ausserhalb) festlegen können.

D.h. In der TestKlasse in der ich die DLL verwende möchte ich mit setImage das Bild setzen.
Jedoch funktioniert das nur wenn ich einen absoluten Pfad verwenden


Image image = new Image();            
BitmapImage img = new BitmapImage(new Uri(@"C:\Lighthouse.jpg", UriKind.Absolute)); 
image.Source = img;
myControl.setImage(image);

Wenn ich jedoch den relativen Pfad verwende zeigt er mir das Bild nicht an.
Siehe:


Image image = new Image();            
BitmapImage img = new BitmapImage(new Uri(@"images\Lighthouse.jpg", UriKind.Relative)); 
image.Source = img;
myControl.setImage(image);

Das Bild ist definitiv in diesem Ordner enthalten und als Resource eingestellt.

Ich habe jetzt festgestellt dass er hier bei diesem relativen Pfad aus der DLL (mit den Controls) ausgeht.
Denn wenn ich ein Bild angebe das in der DLL (mit den Controls) ist dann zeigt er das so an.
Mein Pfad sollte sich jedoch auf das Bild beziehen welches sich im TestProjekt befindet und nich auf ein Bild welches sich in der DLL befindet.

Dafür gibt es doch sicher eine einfache Lösung.
Aber ich denke momentan etwas zuviel in Java deshalb scheitere ich jetzt an so trivialen C# Problemchen. 😉

Wäre nett wenn mir jemand ein wenig weiterhelfen könnte

Grüsse
Michael

5.742 Beiträge seit 2007
vor 14 Jahren

Hallo michlG,

ja ja - schon schlimm, die Auswirkungen von Java 😁
[FAQ] Pfad zur eigenen Anwendung (EXE) ermitteln

Verwende Assembly.GetEntryAssembly().Location und ein Path.Combine. Dann solltest du deinen absoluten Pfad haben.

Aber generell: Es deutet nicht unbedingt auf allzu gutes Design hin, wenn eine DLL Ansprüche an Verzeichnisstrukturen der verweisenden Anwendung stellt.

U
1.688 Beiträge seit 2007
vor 14 Jahren

Mein Pfad sollte sich jedoch auf das Bild beziehen welches sich im TestProjekt befindet und nich auf ein Bild welches sich in der DLL befindet.

Dann bau doch aus dem bekannten und gewünschten Pfad mit Path.Combine einen absoluten Pfad zusammen.

michlG Themenstarter:in
3.430 Beiträge seit 2007
vor 14 Jahren

Hallo,

vielen Dank für eure Hilfe.
Auf die Idee mit den absoluten Pfad bin ich noch nicht gekommen 😃
Aber jetzt läuft das ganze ohne Probleme.

@winsharp93

Aber generell: Es deutet nicht unbedingt auf allzu gutes Design hin, wenn eine DLL Ansprüche an Verzeichnisstrukturen der verweisenden Anwendung stellt.

Die DLL stellt keine Ansprüche an die verweisende Anwendung.
Ich möchte nur dass man von der verweisenden Anwendung aus ein Bild in der DLL festlegen kann.
D.h. die DLL stellt ein WarteControl bereit bei welchem man das Bild festlegen kann.
Es gibt ein paar vordefinierte und man kann zusätzlich noch eigene Bilder angeben.

Das klappt jetzt aber mit dem absoluten Pfad ohne Probleme

ja ja - schon schlimm, die Auswirkungen von Java
[FAQ] Pfad zur eigenen Anwendung (EXE) ermitteln

Oh... Sorry ich bin vorher leider nicht auf die Idee gekommen dieses Faq zu lesen.
Aber danke dass du mir den Link gepostet hast. 😃

Vielen Dank für eure Hilfe

Gruss
Michael

5.742 Beiträge seit 2007
vor 14 Jahren

Ich möchte nur dass man von der verweisenden Anwendung aus ein Bild in der DLL festlegen kann.
D.h. die DLL stellt ein WarteControl bereit bei welchem man das Bild festlegen kann.
Es gibt ein paar vordefinierte und man kann zusätzlich noch eigene Bilder angeben.

Dann wäre es IMHO deutlich sauberer, wenn das Wartecontrol eine Property von Typ ImageSource anbieten würde - dann kann das Bild nämlich auch in den Resourcen gespeichert sein und ist unabhängig vom direkten Laden aus dem Dateisystem.

michlG Themenstarter:in
3.430 Beiträge seit 2007
vor 14 Jahren

Hallo winSharp93,

thx für deine erneute Antwort.
Das mit der ImageSource habe ich schon vorher probiert aber da habe ich das selbe Problem wie wenn ich direkt das Bild mitgebe.
D.h. es funktioniert nur mit absoluten Pfad

In der DLL weise ich die mitgegebenen ImageSource so dem Bild bzw. dem ContentPresenter zu


public void changeImage(ImageSource image)
{
   Image img = new Image();
   img.Source = image;
   ImageMessage.Content = img;
}

Und in der Anwendung (in welcher ich auf die DLL verweise) rufe ich die Methode so auf


changeImage(new BitmapImage(new Uri(@"images/Lighthouse.jpg", UriKind.Relative)));

Das funktioniert aber nur mit absoluten Pfad.
Was habe ich denn da falsch gemacht. Sorry aber ich stehe heute ein wenig auf dem Schlauch 🤔

Grüsse
Michael

5.742 Beiträge seit 2007
vor 14 Jahren

Ja, das ist so eine Sache mit dem Laden von Bildern in der WPF (ich fliege auch jedesmal drauf rein - vielleicht sollte ich aufhören, gelegentlich in Java zu programmieren 🤔 😁 ).

Wenn man tatsächlich relative Pfade zum Laden von Bildern aus Dateien verwenden möchte, geht das AFAIK nicht mit dem BitmapImage.
Dessen primäre Einsatzgebiet ist XAML und somit das Laden von Bildern aus Resourcen.

Dafür muss man den BitmapDecoder bemühen:


BitmapDecoder.Create(new Uri("images\\Lighthouse.jpg", UriKind.Relative), BitmapCreateOptions.None, BitmapCacheOption.Default).Frames[0];

Sieht zwar etwas unhandlich aus, biete dafür aber sehr viele, mächtige Möglichkeiten.

michlG Themenstarter:in
3.430 Beiträge seit 2007
vor 14 Jahren

Hi,

Vielen dank genau das hat mein Problem gelöst.

ich fliege auch jedesmal drauf rein - vielleicht sollte ich aufhören, gelegentlich in Java zu programmieren

Hihi, ich glaube dass ich doch nicht Java schuld an diesem Problem geben darf 🙂
Das war wohl einfach mein Versagen 😁

Jedenfalls danke dass du mich auf die richtige Fährte geführt hast.

Grüsse
Michael

M
2 Beiträge seit 2015
vor 7 Jahren

Hallo ich bin am Verzweifeln und hoffe ihr könnt mir weiterhelfen.

folgendes:

Bilder werden bei mir local perfekt geladen.(sowie ich es haben möchte)
Nach Projektveröffentlichen quarkt der mir das er die pfade nicht findet.

 
switch (counter)
            {
                case 1:
                    
                    textBlock.Text = Klassen.Sprache.translate(dialog[counter]);
                    var uri = new Uri(@"../../Bilder/tiere/hund/hundstock01.jpg", UriKind.RelativeOrAbsolute);
                    var bitmap = new BitmapImage(uri);
                    gridElement.Background = new ImageBrush(bitmap);
                    counter++;
                    break;
                case 8:
                    textBlock.Text = Klassen.Sprache.translate(dialog[counter]);
                    var uri01 = new Uri(@"../../Bilder/@"../../Bilder/tiere/hund/hundstock02.jpg", UriKind.RelativeOrAbsolute);
                    var bitmap01 = new BitmapImage(uri01);
                    gridElement.Background = new ImageBrush(bitmap01);
                    counter++;
                    break;

funktioniert prächtig nur eben nicht nach Veröffentlichung und wenn sich das jemand installiert.

Der Pfad vom Projekt aus (local) ist.

Bilder:
Projekt/Bilder/tiere/hund/..jpg

Datei wo die Bilder aufgerufen werden:
Projekt/Seiten/Hund/Stock/...xaml

Leider verstehe ich gar nicht was ich da falsch mache und etwas zu finden ist die Qual.

T
2.224 Beiträge seit 2008
vor 7 Jahren

@mimau1983
Stimmen den nach der Veröffentlichung deine Relativen Pfade noch?
Ich versuche relative Pfade immer in Absolute Pfade umzuwandeln mit hilfe von Path.Combine
Dann kann ich quasi den absoluten Pfad bauen und muss mir dann auch keine sorge machen, wenn die relativen Pfade dann auch nicht mehr passen.
Entsprechend solltest du deine Verarbeitung auch ggf. umstellen um das Problem zu lösen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

771 Beiträge seit 2009
vor 7 Jahren

Hi,

das Projektverzeichnis interessiert dabei nicht, sondern immer nur das Deployverzeichnis ".../bin/release" (und dann sollten Dateien auch nur unterhalb davon sein).
Die Bilddateien solltest du mittels "copy to output dir" auf "copy, if newer" einstellen, so dass dann eine Kopie davon im Deployverzeichnis erstellt wird (welche du dann in den Installer packen mußt).

709 Beiträge seit 2008
vor 7 Jahren

Die fehlt ein zusätzliches "../". So bist du ein Verzeichnis zu weit oben.
"/Bilder/tiere/hund/hundstock01.jpg" sollte aber auch funktionieren.

D
985 Beiträge seit 2014
vor 7 Jahren

Ich stimme für @Cat

Wenn die Bilder nicht deployed werden, dann wird jeder Pfad ins Leere laufe.
Werden die Bilder deployed, dann sind diese aktuellen Pfade nur in der Entwicklungsumgebung gültig und das aktuelle Verzeichnis gleich dem Anwendungsverzeichnis ist.

Es gibt also mehrere Möglichkeiten für den Fehler und auch noch einen Fehler, der sich während der Laufzeit zeigen kann (das aktuelle Verzeichnis wird gewechselt).

Bei relativen Pfadangaben muss man darauf achten, dass man das relativ zu was immer im Blick hat (und nicht aus den Augen verliert) 😉

M
2 Beiträge seit 2015
vor 7 Jahren
Danke für eure Hilfe

Hi ich bin ja gestern Abend echt böse geworden und konnte es nicht glauben das das so schwierig ist.

Also eiskalt alle Bilder gelöscht und wieder neu hinzugefügt.

Path ist jetzt dort wo die .xaml

Code bisschen angepasst und es funktioniert.


textBlock.Text = Klassen.Sprache.translate(dialog[counter]);
                    var bitmap = new BitmapImage(new Uri(BaseUriHelper.GetBaseUri(this), "../../Bilder/tiere/hund/hundstock02.jpg"));
                    gridElement.Background = new ImageBrush(bitmap);
                    counter++;
                    break;


Kann es sein wenn ich mehrere Bilder auf einmal hinzufüge das VS 2015 es nicht checkt.

PS: Das Problem hab ich immer noch nicht verstanden 😄

@cat werde ich ausprobieren danke

@T-Virus,pinki,Sir Rufo vielen Dank für die schnellen Antworten

D
985 Beiträge seit 2014
vor 7 Jahren

Deine Anwendung liegt im Verzeichnis C:\Program Files\Foo\FooApp.exe.

Jetzt starte ich diese Anwendung von der Console:


C:\> "C:\Program Files\Foo\FooApp.exe"

Mit deinen relativen Pfaden würde jetzt das Bild ..\..\Bilder\tiere\hund\hundstock02.jpg von C:\..\..\Bilder\tiere\hund\hundstock02.jpg gelesen werden, was dann aufgelöst C:\Bilder\tiere\hund\hundstock02.jpg ergibt.

Da liegen die Bilder aber nicht ... dort werden die aber gesucht, weil du nur angegeben hast relativ zu ??? und ??? heißt immer aktuelles Verzeichnis und das ist im Moment C:\