IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: C# načtení Image do paměti.

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
tomkrata
Člen
Avatar
tomkrata:6.2.2018 11:57

Po načtení obrázku nemůže být s obrázkem manipulováno, protože je "používán". Ja by tedy šlo načíst obrázek do programu a například ho vymazat z disku, ale stále ho mít v RAMce. Našel jsem tuto metodu.

public BitmapImage LoadImageToMemory(string path)
{
        BitmapImage image = new BitmapImage();

        try
        {
            image.BeginInit();
            image.CacheOption = BitmapCacheOption.OnLoad;
            System.IO.Stream stream = System.IO.File.Open(path, System.IO.FileMode.Open);
            image.StreamSource = new System.IO.MemoryStream();
            stream.CopyTo(image.StreamSource);
            image.EndInit();

            stream.Close();
            stream.Dispose();
            image.StreamSource.Close();
            image.StreamSource.Dispose();
        }
        catch { throw; }

        return image;
}

, ale funguje pouze ve WPF.

 
Odpovědět
6.2.2018 11:57
Avatar
Odpovídá na tomkrata
Erik Šťastný:6.2.2018 12:00

A pro jakou platformu hledáš řešení? Ve všech to funguje naprosto totožně, otevřeš soubor, přečteš a pokud ho chceš použít jinde nebo smazat, tak ho musíš zavřít.

Tak to funguje ať ve WPF tak v C++

 
Nahoru Odpovědět
6.2.2018 12:00
Avatar
tomkrata
Člen
Avatar
Odpovídá na Erik Šťastný
tomkrata:6.2.2018 12:06

Dělám ve WFA. A budu moci nadále pracovat s tím souborem i po zavření?

Editováno 6.2.2018 12:06
 
Nahoru Odpovědět
6.2.2018 12:06
Avatar
Odpovídá na tomkrata
Erik Šťastný:6.2.2018 12:10

Se souborem fyzicky ne od toho to zavření je, ale s jeho daty, která si načteš někam ano.

 
Nahoru Odpovědět
6.2.2018 12:10
Avatar
HONZ4
Člen
Avatar
Odpovídá na tomkrata
HONZ4:6.2.2018 17:39

Tak jak máš ten kód teď, tak je to špatně. V případě, že sleže při čtení souboru tak to skočí do catch a soubor se nezavře. Doporučuju použít using (nebo zavírat ve finaly).

Pokud to myslíš tak, že chceš pracovat s obrázkem takto stačí udělat třeba takto:

static Image LoadImageFromFile(string filename)
{
  using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
  {
    return Image.FromStream(stream);
  }
}

private Image _image; //tady můžeš mít uložený obrázek po celou dobu chodu aplikace

private void LoadPicture(string filename)
{
   try
   {
     Image img = LoadImageFromFile(filename);
     //tady už můžeš soubor smazat
     _image = img; //
   }
   catch(Exception ex)
   {
      MessageBox.Show(ex.Message, "Chyba");
   }
}
//kód jsem psal bez visual studia, takže tam může být nějaká chybka
Editováno 6.2.2018 17:41
 
Nahoru Odpovědět
6.2.2018 17:39
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.