2009-06-24 6 views
7

J'ai une page ASP.NET C# où je redimensionne les images dans un dossier. J'utilise GDI + pour le faire. Je veux redimensionner les images et remplacer par Les anciennes images.Alors que j'essaie d'enregistrer avec le nom existant, la méthode Save jette une erreur. Mais si je donne un nom différent, il est enregistré.Mais je veux avoir le même nom de fichier pour l'image redimensionnée nouvellement créée comme j'ai besoin d'écraser le fichier existant avec le nouveau fichier qui est redimensionné. Toute idée de comment aller de l'avant. Mon code estC#: GDI +: Écraser une image en utilisant la méthode Save de 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); 
     } 

si je commente la première ligne qui crée un nouveau nom pour le fichier de destination, il ne fonctionnera pas., D'autres wose il will.But je veux avoir le même nom pensée .Tout? ? ? Merci d'avance

Répondre

11

Vous devez d'abord supprimer le fichier original. Il est important de faire la distinction - lorsque vous travaillez avec la manipulation d'images dans .NET, vous travaillez avec un objet en mémoire dont les octets ont été remplis en lisant l'image originale. Vous ne travaillez pas avec l'image originale réelle. Donc, quand vous allez sauvegarder cet objet entièrement nouveau (qui utilise des données d'une image existante), et que vous essayez d'utiliser un chemin déjà utilisé, vous obtiendrez une exception.

Vous devez également vous assurer que le fichier d'origine n'est pas encore ouvert à ce stade; assurez-vous de disposer du flux de fichier d'origine que vous avez utilisé pour remplir l'objet Image que vous manipulez. Puis supprimez, puis enregistrez.

+0

beaucoup de lumières qui se passe dans mon pays, ce n'est pas la meilleure idée. – deadManN

18

Si vous chargez une image en utilisant la technique dans la ligne suivante

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

alors ce qui maintient une poignée ouverte au fichier lorsque vous essaierez l'écraser le fichier est toujours en cours d'utilisation et donc vous êtes incapable d'écrire dessus. Pour contourner ce problème, si vous chargez le fichier dans un flux, cela vous permet d'écraser le fichier d'origine lorsque le handle de fichier a été libéré lorsque les informations d'image ont été écrites en mémoire.

Vous pouvez le faire de la manière suivante:

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: "Vous devez garder le flux ouvert pendant la durée de vie de l'image." – Tewr

Questions connexes