C# Image Source

Fórumok

Üdv,

Kódból szeretném beállítani az Image objektum Source értékét (WPF app). Abszolút útvonal működik:

image.Source = new BitmapImage(new Uri("c:/x/myimage.png"));

A relatív útvonal nem. Hogyan kellene ezt megadni? Hiába néztem a súgót a MS honlapon, valamit elrontok:

image.Source = new BitmapImage( new Uri( "pack://application:,,,/myimage.png" ) );
image.Source = new BitmapImage( new Uri( "pack://application:,,,/component/myimage.png" ) );
// Error: cannot locate source ...

A myimage a projekt főkönyvtárában (is) ott van, ill. a 'component' könyvtárban. Ide másolta amikor beállítom a Designer-ben.

Hozzászólások

Milyen doksi alapján gondolod, hogy használható ilyen szintaxis?

A WPF-et nem vagom (hal' Istennek :)), de a pack:// itt mi akar lenni?

Nezd meg, hogy masolodik-e a kepfajl a build output folderbe, es ha igen, new Uri("myimage.png"). Vagy meg hulyebiztosabb, ha

Nem értek a C#-hoz, de ha odamásoltad a fájlt az EXE mellé, akkor a helyes URI

image.Source = new BitmapImage(new Uri("myimage.png"));

esetleg

image.Source = new BitmapImage(new Uri("file://./myimage.png"));

Ez a "pack:" protokoll egyébként egész véletlenül nem egy shorthand akarna lenni fordítási idejű data URI generáláshoz? Akárhogy is, a ",,,/myimage.png" a végén tutira azt jelenti, hogy az aktuális meghajtó gyökérkönyvtárában keresse, ott meg jogos, hogy nem találja. Bár a hibaüzenet inkább azt jelenti, hogy a "pack:" protokoll nincs támogatva.

A kolléga jól adja meg a "pack://application:,,,/myimage.png" részt. Az "application:,,," rész is jó, mert a program azt "application:///"-ként használja, csak mivel a "/" karakter foglalt, így helyettesíteni kell.

Mellékesen az írt pack hivatkozások is abszolút elérési utak és nem relatívak, mert az application (vagy a siteoforigin) pontosan meghatározza honnan fut az alkalmazás.

Esetleg a következő mód ha relatív elérés kell:

image.Source = new BitmapImage( new Uri( "/component/myimage.png", UriKind.Relative ) );

"Errors are red
My screen in blue
Someone help me
I've deleted Sys32"

A kolléga jól adja meg a "pack://application:,,,/myimage.png" részt.

Szerintem nem.

Mellékesen az írt pack hivatkozások is abszolút elérési utak és nem relatívak

Erről van szó. Emiatt biztos, hogy a fájlrendszer gyökerében keresné a fájlt, és nem pedig az EXE könyvtárában.

De igazából mindegy is, mert a hibaüzenet egyértelműen az, hogy a "pack:" protokoll nem használható. Szóval szerintem érdemesebb a "file:"-al próbálkozni, esetleg beágyazni a fájlt "data:" URI-val, és akkor nincs szükség külön png-re és elérési út mókolásra.

(Ps. nem ismerem a C#-t, de nekem gyanús, hogy a specifikáció szerint a "/component/myimage.png" nem egy érvényes URI, annak ugyanis mindenképp "protokoll:"-al kell kezdődnie. Ettől persze még a C#-os URI class elfogadhatja, és magától elébiggyesztheti, hogy "file:", ezt a részét nem vágom.)

Szerintem a content csak másol, szeintem neki az <EmbeddedResource Include="file.png" /> tag kellene a csproj-ba. Amúgy VS-val a file property-jei között lehet állítani (Build Action: Embedded Resource, https://learn.microsoft.com/en-us/visualstudio/ide/build-actions?view=v…), ha nem szeretné kézzel beírni a csproj-ba. De az URI szerintem is jó. Bővebben: https://learn.microsoft.com/en-us/dotnet/desktop/wpf/app-development/pa…

A pack emlékeim szerint resource-file elérésére való.

Neked valami ilyesmi kell:

new Uri("file://", Path.Combine(AppContext.BaseDirectory, "component/myimage.png"))

bmp fájt probáltál? (egyetemi példákban mindig az volt)

new BitmapImage(new Uri("myimage.png", UriKind.Relative));

Ez nem jo?

A pack:// séma embedded resource-hoz való, nem a fájlrendszeren keresgél, hanem az exe/dll belsejében. A relatív elérésnél file:// séma kell, és neki kell megadni, hogy mihez képest legyen relatív.

Ezek már tegnap le lettek írva, de a kérdező ignorálta, és még ma is azt írta, hogy próbálkozik és nem megy.

Így működik pl., köszönöm Mindenkinek!

image.Source = new BitmapImage(new Uri(AppContext.BaseDirectory + "/component/myimage.png", UriKind.Absolute ));

Az "AppContext.BaseDirectory" visszaadja az aktuális könyvtárat (EXE).

De még megpróbálom a UriKind.Relative beállítást.

Egy lehetőség lehet az is, hogy Reflectionnel megnézed az exe futási helyét és ha a képek ugyanabba folderbe vannak mindig akkor csak simán összekonkatenálod az útvonalat és kész. A képekre meg beállitod a Visual Studio-ban hogy always copy.