2009-06-24 7 views
7

Ho una pagina ASP.NET C# dove sto ridimensionando le immagini in una cartella. Sto usando GDI + per fare questo. Voglio ridimensionare le immagini e sostituirle con le vecchie immagini.Così quando sto cercando di salvare con il nome esistente, il metodo Save sta generando un errore. Ma se do un nome diverso viene salvato. Ma voglio avere lo stesso nome file per l'immagine ridimensionata appena creata come ho bisogno di sovrascrivere il file esistente con il nuovo file che viene ridimensionato. Qualche idea su come andare avanti. mio codice èC#: GDI +: sovrascrittura di un'immagine utilizzando il metodo di salvataggio bitmap

 oldImagePath= oldImagePath.Replace(".jpg", "NEW.jpg"); 

     try 
     { 
      ImageCodecInfo[] Info = ImageCodecInfo.GetImageEncoders(); 
      EncoderParameters Params = new EncoderParameters(1); 
      Params.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); 
      target.Save(oldImagePath, Info[1], Params); 
     } 

se io commento la prima linea che crea un nuovo nome per il file di destinazione, non funzionerà., Altri wose è will.But voglio avere lo stesso nome pensiero .Any? ? ? Grazie in anticipo

risposta

11

È necessario prima eliminare il file originale. È importante fare la distinzione - quando si lavora con la manipolazione delle immagini in .NET, si sta lavorando con un oggetto in memoria i cui byte sono stati popolati leggendo l'immagine originale. Non stai lavorando con l'immagine originale attuale. Quindi quando si va a salvare questo oggetto completamente nuovo (che capita di utilizzare i dati da un'immagine esistente), e si tenta di utilizzare un percorso già in uso, si otterrà un'eccezione.

È inoltre necessario assicurarsi che il file originale non sia ancora aperto a questo punto; assicurati di disporre del flusso di file originale che hai usato per popolare l'oggetto Immagine che stai manipolando. Quindi eliminare, quindi salvare.

+0

sacco di luci spente accade nel mio paese, non è la migliore idea. – deadManN

18

Se si carica un'immagine utilizzando la tecnica nella riga seguente

Image imgPhoto = Image.FromFile("myphoto.jpg"); 

allora questo mantiene un handle aperto il file in modo che quando si tenta di sovrascrivere il file è ancora attualmente in uso e quindi si sono incapace di scrivere ad esso.

Per aggirare questo problema, se si carica il file in un flusso, questo consente di sovrascrivere il file originale man mano che l'handle del file è stato liberato poiché le informazioni dell'immagine sono state scritte in memoria.

È possibile farlo nel modo seguente:

FileStream fs = new FileStream("myphoto.jpg", FileMode.Open); 
Image imgPhoto = Image.FromStream(fs); 
fs.Close(); 
+0

http://msdn.microsoft.com/en-us/library/93z9ee4x(v=vs.110).aspx: "È necessario mantenere aperto lo stream per la durata dell'immagine." – Tewr

Problemi correlati