[C#] WPF - BitmapImage & Metadata - Image locked

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von HuNdI, 16. April 2013 .

Schlagworte:
  1. 16. April 2013
    WPF - BitmapImage & Metadata - Image locked

    Hallo

    Ich versuche jetzt schon länger, ein Bild in WPF darzustellen (was funktiniert) und daraufhin die Metadata (Kommentar) zu ändern.

    Dazu habe ich ein ImageObjekt in meinem XAML Code und ein ViewModel, in dem ich ein BitmapImage erstelle und an die Source des Image binde.

    Code:
    <Image Source="{Binding BitmapImage, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
    Was funktioniert:
    - Bild darstellen
    - Metadata lesen

    Was nicht funktiniert:
    - Metadata schreiben

    Warum nicht:
    - Das ImageObjekt (Bild) ist gesperrt (locked vom Programm)

    Bereits probiert:
    - Das BitmapImage Objekt auf verschiedene Weise zu erstellen (Einfaches Erstellen, FileStream, MemoryStream)
    - Das BitmapImage Objekt neu erstellen und ein anderes Bild laden

    Erstmals so versucht (noch ohne CreateOptions & CacheOptions), dann gelesen, dass CachOption auf OnLoad stehen solle damit es nicht gesperrt wird: (Was bei den Meisten wohl funktiniert, hier jedoch nicht)
    Code:
    BitmapImage = null;
    BitmapImage = new BitmapImage();
    BitmapImage.BeginInit();
    BitmapImage.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
    BitmapImage.CacheOption = BitmapCacheOption.OnLoad;
    BitmapImage.UriSource = new Uri(path);
    BitmapImage.EndInit();
    Auch versucht:
    Code:
    BitmapImage myRetVal = null;
    if (myImageFile != null)
    {
     BitmapImage image = new BitmapImage();
     using (FileStream stream = File.OpenRead(myImageFile))
     {
     image.BeginInit();
     image.CacheOption = BitmapCacheOption.OnLoad;
     //image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
     image.StreamSource = stream;
     image.EndInit();
     }
     myRetVal = image;
    }
    BitmapImage = myRetVal;
    Und:
    Code:
    MemoryStream ms = new MemoryStream();
    FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
    ms.SetLength(stream.Length);
    stream.Read(ms.GetBuffer(), 0, (int)stream.Length);
    
    ms.Flush();
    stream.Close();
    
    System.Windows.Controls.Image i = new System.Windows.Controls.Image();
    BitmapImage src = new BitmapImage();
    src.BeginInit();
    src.StreamSource = ms;
    src.EndInit();
    i.Source = src;
    i.Stretch = Stretch.Uniform;
    Image = i;
    Egal mit welcher Methode, wenn ich versuche Metadata zu schreiben, bekomme ich den Fehler dass die Datei gesperrt ist. (Kann nicht auf Datei zugreifen, weil von anderem Prozess gesperrt)

    Zu schreiben versuche ich mit dieser Methode:
    Code:
    public void SetMetaData(string path, int metaDataID, string metaData)
    { 
     FileStream FileStream = new FileStream(path, FileMode.Create);
     BitmapMetadata BitmapMetadata = new BitmapMetadata("jpeg");
     JpegBitmapEncoder JpegBitmapEncoder = new JpegBitmapEncoder();
     BitmapMetadata.Comment = "TEST";
     JpegBitmapEncoder.Frames.Add(BitmapFrame.Create(FileStream));
     JpegBitmapEncoder.Save(FileStream);
     FileStream.Close();
    }
    Ich vermute inzwischen schon, dass es an dem Metadata schreiben liegt, wobei ich mir nicht erklären kann, wieso die Datei immer gesperrt bleibt.
    (Die Methode funktioniert übrigens, wenn ich das Bild nicht öffne, bzw. die Methode ausführe, bevor das ImageObjekt erstellt und gebunden wird)

    Falls jemandem entwas einfällt oder etwas sieht, bitte melden, mir fällt nichts mehr ein..
     
  2. 22. April 2013
    AW: WPF - BitmapImage & Metadata - Image locked

    Das Thema mit den blockierten Bildern ist immer so eine Sache...
    Was hat mich das schon graue Haare gekostet....

    Folgendes hat bei mir bisher keine Probleme gemacht:
    Code:
    BitmapImage bi = new BitmapImage();
     
    using (MemoryStream byteStream = new MemoryStream(buffer))
     {
     
     bi.BeginInit();
     bi.CacheOption = BitmapCacheOption.OnLoad;
     bi.StreamSource = byteStream;
     bi.EndInit();
     }
    
     return bi;
    
    Eventuell könnte dir dieser Zusatz helfen (habs nicht getestet):
    Code:
    bi.CreateOption = BitmapCreateOptions.IgnoreImageCache;
    

    Bzgl schreiben von Metadaten:
    Reading and Writing Tags for Photos in WPF | Between the Lines

    Das Problem ist, dass WPF ein Bild, welches an ein Control gebunden wird, nicht mehr frei gibt, bis die Anwendung geschlossen wird...

    Es könnte dir also eventuell helfen, wenn du das Bild immer neu erzeugst (was eigentlich ein Wahnsinn ist...) - aber nur aus Neugierde würde ich es mal probieren.

    Grüße
     
  3. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.