2012-11-15 8 views
5

La mia applicazione elenca tutti gli MP3 in una directory e quando l'utente seleziona un file carica le informazioni del tag, inclusa la copertina dell'album. L'arte viene caricata in una variabile da utilizzare quando l'utente salva i dati. L'arte è anche caricata in una cornice per l'utente da vedere.Caricamento Album art con TagLib sharp e quindi salvarlo sullo stesso file/diverso in C# causa errore di memoria

// 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(); 

Se carico l'immagine e cercare di salvarla subito ho questa "Tentativo di lettura o scrittura della memoria protetta. Ciò è spesso un'indicazione che l'altra memoria è danneggiata." Se provo a salvare currentImage come ImageFormat.Bmp ottengo questo "Si è verificato un errore generico in GDI +".

Il mio salvare metodo funziona correttamente se carico un'immagine da un URL simile a questo:

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

Così sto indovinando c'è un problema con il modo in cui sto caricando l'immagine nel currentImage quando l'utente seleziona un MP3 dalla lista.

Ho trovato molti esempi di caricamento e salvataggio di immagini su mp3 ma nessuno sembra avere questo problema quando provano a salvarlo subito dopo averlo caricato.

risposta

1

Il materiale del flusso deve essere in uso blocchi, che sarà dispose delle merci automagicamente e chiuderli anche. Non molto importante, ma più facile da gestire.

L'errore GDI + generico è probabile perché si sta tentando di eseguire un'operazione o di chiamare un metodo su un file per cui lo stream è già chiuso.

Check it out...

+0

Grazie per il punto nella giusta direzione. Ho pubblicato i miei risultati in un'altra risposta da quando ho postato del codice. – Ovin08

+0

--------- Saluti –

2

Grazie per l'aiuto di Jim, ma non riuscivo a farlo funzionare con i 'utilizzando' blocchi in modo sto cercando di indovinare il torrente era ancora chiudendo da qualche parte. Ho trovato un altro modo per fare ciò che stavo cercando memorizzando/salvando un byte [] invece di un'immagine. E poi basta salvarlo utilizzando:

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

il metodo non è in realtà falsa, solo poche cose dovevano essere cambiate:

// 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();