2012-11-15 10 views
5

Meine Anwendung listet alle MP3s in einem Verzeichnis auf. Wenn der Benutzer eine Datei auswählt, lädt er die Tag-Informationen, einschließlich Albumcover. Die Grafik wird in eine Variable geladen, die verwendet werden soll, wenn der Benutzer die Daten speichert. Die Grafik wird auch in einen Bilderrahmen geladen, damit der Benutzer sie sehen kann.Albumcover mit TagLib sharp laden und dann in C# in einer anderen Datei speichern.

// Global to all methods 
System.Drawing.Image currentImage = null; 

// In method onclick of the listbox showing all mp3's 
TagLib.File f = new TagLib.Mpeg.AudioFile(file); 
if (f.Tag.Pictures.Length > 0) 
{ 
     TagLib.IPicture pic = f.Tag.Pictures[0]; 
     MemoryStream ms = new MemoryStream(pic.Data.Data); 
     if (ms != null && ms.Length > 4096) 
     { 
      currentImage = System.Drawing.Image.FromStream(ms); 
      // Load thumbnail into PictureBox 
      AlbumArt.Image = currentImage.GetThumbnailImage(100,100, null, System.IntPtr.Zero); 
     } 
     ms.Close(); 
} 

// Method to save album art 
TagLib.Picture pic = new TagLib.Picture(); 
pic.Type = TagLib.PictureType.FrontCover; 
pic.MimeType = System.Net.Mime.MediaTypeNames.Image.Jpeg; 
pic.Description = "Cover"; 
MemoryStream ms = new MemoryStream(); 
currentImage.Save(ms, ImageFormat.Jpeg); // <-- Error occurs on this line 
ms.Position = 0; 
pic.Data = TagLib.ByteVector.FromStream(ms); 
f.Tag.Pictures = new TagLib.IPicture[1] { pic }; 
f.save(); 
ms.Close(); 

Wenn ich das Bild laden und versuchen, es zu speichern sofort ich diese bekommen „Versuchte geschützte Speicher zu lesen oder schreiben. Dies ist häufig ein Hinweis darauf, dass andere Speicher beschädigt sind.“ Wenn ich versuche, currentImage als ImageFormat.Bmp zu speichern, bekomme ich Folgendes: "Ein generischer Fehler ist in GDI + aufgetreten."

meine Methode speichern funktioniert ordnungsgemäß, wenn ich ein Bild von einer URL wie folgt laden:

WebRequest req = WebRequest.Create(urlToImg); 
WebResponse response = req.GetResponse(); 
Stream stream = response.GetResponseStream(); 
currentImage = Image.FromStream(stream); 
stream.Close(); 

So vermute ich gibt es ein Problem mit der Art und Weise, dass ich das Bild in currentImage bin Laden, wenn der Benutzer Wählt eine MP3 aus der Listbox.

Ich habe viele Beispiele zum Laden und Speichern von Bildern in MP3s gefunden, aber niemand scheint dieses Problem zu haben, wenn sie versuchen, die Bilder sofort nach dem Laden zu speichern.

Antwort

1

Ihr Stream-Zeug sollte in Blöcke, die automatisch dispose Ihrer Waren werden und schließen sie auch sein. Nicht sehr wichtig, aber leichter zu verwalten.

Ihr generischer GDI + -Fehler ist wahrscheinlich, weil Sie versuchen, eine Operation auszuführen oder eine Methode für eine Datei aufzurufen, für die der Stream bereits geschlossen ist.

Check it out...

+0

Danke für den Punkt in der richtigen Richtung. Ich habe meine Ergebnisse in einer anderen Antwort veröffentlicht, seit ich einen Code gepostet habe. – Ovin08

+0

--------- Prost –

2

Danke für die Hilfe Jim aber ich kann wirklich nicht bekommt es funktioniert die ‚Verwendung‘ Blöcke mit so der Strom vermute ich noch irgendwo schließt. Ich habe einen anderen Weg gefunden, das zu tun, wonach ich gesucht habe, indem ich ein Byte [] anstelle eines Bildes gespeichert/gespeichert habe. Und dann Speichert sie nur mit:

using (MemoryStream ms = new MemoryStream(currentImageBytes)) 
{ 
    pic.Data = TagLib.ByteVector.FromStream(ms); 
    f.Tag.Pictures = new TagLib.IPicture[1] { pic }; 
    if (save) 
     f.Save(); 
} 
1

Ihre Methode nicht wirklich falsch ist, nur ein paar Dinge mußten geändert werden:

// Method to save album art 
TagLib.Picture pic = new TagLib.Picture(); 
pic.Type = TagLib.PictureType.FrontCover; 
pic.MimeType = System.Net.Mime.MediaTypeNames.Image.Jpeg; 
pic.Description = "Cover"; 
MemoryStream ms = new MemoryStream(); 
currentImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); // <-- Error doesn't occur anymore 
ms.Position = 0; 
pic.Data = TagLib.ByteVector.FromStream(ms); 
f.Tag.Pictures = new TagLib.IPicture[1] { pic }; 
f.save(); 
ms.Close();