2009-06-24 10 views
7

Tengo una página de ASP.NET C# donde estoy redimensionando las imágenes en una carpeta. Estoy usando GDI + para hacer esto. Quiero cambiar el tamaño de las imágenes y reemplazarlas por las viejas imágenes. Así que cuando estoy tratando de guardar con el nombre existente, el método Save arroja un error. Pero si le doy un nombre diferente, se está guardando. Pero quiero tener el mismo nombre para la nueva imagen redimensionada ya que necesito sobrescribir el archivo existente con el nuevo archivo cuyo tamaño se ha modificado. Alguna idea de cómo seguir adelante. Mi código esC#: GDI +: Escritura de más de una imagen usando Save Method of 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 comento la primera línea que crea un nuevo nombre para el archivo de destino, no va a funcionar., Otra Wose que will.But quiero tener el mismo nombre pensamiento .Any? ? ? Gracias de antemano

Respuesta

11

Primero debe eliminar el archivo original. Es importante hacer la distinción: cuando trabaja con manipulación de imágenes en .NET, está trabajando con un objeto en memoria cuyos bytes se completaron al leer la imagen original. No estás trabajando con la imagen original real. Por lo tanto, cuando vaya a guardar este objeto completamente nuevo (que usa datos de una imagen existente) e intente utilizar una ruta que ya esté en uso, obtendrá una excepción.

También debe asegurarse de que el archivo original aún no esté abierto en este punto; asegúrese de deshacerse de la secuencia de archivo original que utilizó para llenar el objeto de Imagen que está manipulando. Luego borra, luego guarda.

+0

gran cantidad de luces que sucede en mi país, no es la mejor idea. – deadManN

18

Si se carga una imagen utilizando la técnica en la siguiente línea

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

entonces esto mantiene un identificador abierto en el archivo de modo que cuando se intenta sobreescribir el archivo todavía está en uso y por lo que son incapaz de escribirle

Para evitar esto, si carga el archivo en una secuencia, esto le permite sobrescribir el archivo original ya que el identificador del archivo se ha liberado ya que la información de la imagen se ha escrito en la memoria.

Esto se puede hacer de la siguiente manera:

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: "Debe mantener la secuencia abierta durante toda la vida de la imagen". – Tewr

Cuestiones relacionadas