2013-07-16 9 views
-2

я должен изменить размер изображения каталога,Изменение размеров всех изображений в каталоге

, но я получаю сообщение об ошибке, доступ запрещен, на этой линии

System.IO.File.Delete(_path); 

я знаю, что это потому, что образ я прочитанный в использовании, но не знают, как справиться с этим

я нашел ссылки на SO, но все они находятся в PHP :-(

for (int i = 1; i < dt.Rows.Count; i++) 
{ 
    try 
    { 
     string _ImageUrl = HttpContext.Current.Request.PhysicalApplicationPath + 
      "Data\\" + dt.Rows[i]["ProductImage"].ToString(); 

     string _extName = System.IO.Path.GetExtension(_ImageUrl); 

     System.Drawing.Image _productImage = ImageReSize(_ImageUrl, 500); 
     string _path = _ImageUrl; 

     if (System.IO.File.Exists(_path)) 
     System.IO.File.Delete(_path); 

     _productImage.Save(_path); 

     _productImage = ImageReSize(_ImageUrl, 85); 
     string _strImageName2 = dt.Rows[i]["ProductSmallImage"].ToString(); 

     _path = HttpContext.Current.Request.PhysicalApplicationPath + 
      "Data\\" + _strImageName2; 

     if (System.IO.File.Exists(_path)) 
     System.IO.File.Delete(_path); 
     _productImage.Save(_path); 
    } 
} 

код изменения размера

public System.Drawing.Image ImageReSize(string _imageUrl, int Width) 
    { 
     try 
     { 
      //uploadImageFile.PostedFile.InputSteam 
      System.Drawing.Image oImg = System.Drawing.Image.FromFile(_imageUrl); 

      //((oh *nw)/ow)*100 

      int Height = ((oImg.Height * Width)/oImg.Width);    // (oImg.Width * Width); 
      Size PictureThumbSize = new Size(); 
      PictureThumbSize.Height = Height; 
      PictureThumbSize.Width = Width; 
      System.Drawing.Image oThumbNail = new Bitmap(PictureThumbSize.Width, PictureThumbSize.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 

      Graphics oGraphic = Graphics.FromImage(oThumbNail); 

      oGraphic.CompositingQuality = CompositingQuality.HighQuality; 

      oGraphic.SmoothingMode = SmoothingMode.HighQuality; 

      oGraphic.InterpolationMode = InterpolationMode.HighQualityBicubic; 

      Rectangle oRectangle = new Rectangle(0, 0, PictureThumbSize.Width, PictureThumbSize.Height); 

      oGraphic.DrawImage(oImg, oRectangle); 
      oImg.Dispose(); 
      return oThumbNail; 
      //oThumbNail.Save(sPhysicalPath + @"\" + newFileName, ImageFormat.Jpeg); 
     } 
     catch (Exception Ex) 
     { 
      return null; 
     } 
    } 
+2

Доступ запрещен где? Какая линия? Помогите нам помочь. – Nolonar

+0

я отредактировал сообщение, пожалуйста, посмотрите еще раз, спасибо –

+0

Код 'ImageReSize'? – JeffRSon

ответ

0

вызова Dispose на исходное изображение, прежде чем пытаться удалить его.

+0

Да, это так же, все та же проблема –

1

Прежде всего вам не нужно удалять файл перед сохранением, функция Image.Save() заменит существующее изображение, но вы должны убедиться, что все ручки, указывающие на изображение, должны быть удалены. вот пример, чтобы объяснить мою точку зрения:

 var image = new Bitmap("test.png"); 

     var image2 = resizeImage(image, new Size(48, 48)); 
     //image.Dispose(); 
     image2.Save("test.png"); 

Без dipose вы будете иметь Exeption, но если вы раскомментировать строку image.Dispose() он будет работать как шарм.

для функции resizeImage я скопировал на вопрос Resize an Image C#

и вот код:

public static Image resizeImage(Image imgToResize, Size size) 
{ 
    return (Image)(new Bitmap(imgToResize, size)); 
} 

EDIT:

кажется, что объект Графика является причиной, вам нужно вызвать oGraphic.Dispose();

Позвоните в _productImage.Dispose() после сохранения.

На самом деле более правильным способом является:

for (int i = 1; i < dt.Rows.Count; i++) 
    { 
    try 
    { 
     string _ImageUrl = HttpContext.Current.Request.PhysicalApplicationPath + 
      "Data\\" + dt.Rows[i]["ProductImage"].ToString(); 

     string _extName = System.IO.Path.GetExtension(_ImageUrl); 

     using (System.Drawing.Image _productImage = ImageReSize(_ImageUrl, 500)) 
     { 
     string _path = _ImageUrl; 

     if (System.IO.File.Exists(_path)) 
      System.IO.File.Delete(_path); 

     _productImage.Save(_path); 
     } 
     using (System.Drawing.Image _productImage = ImageReSize(_ImageUrl, 85)) 
     { 
     string _strImageName2 = dt.Rows[i]["ProductSmallImage"].ToString(); 

     _path = HttpContext.Current.Request.PhysicalApplicationPath + 
      "Data\\" + _strImageName2; 

     if (System.IO.File.Exists(_path)) 
      System.IO.File.Delete(_path); 
     _productImage.Save(_path); 
     } 
    } 
    catch 
    { 
     //Handle the exeption 
    } 
    } 

public System.Drawing.Image ImageReSize(string _imageUrl, int Width) 
{ 

    try 
    { 
    //uploadImageFile.PostedFile.InputSteam 
    using (System.Drawing.Image oImg = System.Drawing.Image.FromFile(_imageUrl)) 
    //((oh *nw)/ow)*100 
    { 
     int Height = ((oImg.Height * Width)/oImg.Width);    // (oImg.Width * Width); 
     Size PictureThumbSize = new Size(); 
     PictureThumbSize.Height = Height; 
     PictureThumbSize.Width = Width; 
     System.Drawing.Image oThumbNail = new Bitmap(PictureThumbSize.Width, PictureThumbSize.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 

     using (Graphics oGraphic = Graphics.FromImage(oThumbNail)) 
     { 
     oGraphic.CompositingQuality = CompositingQuality.HighQuality; 

     oGraphic.SmoothingMode = SmoothingMode.HighQuality; 

     oGraphic.InterpolationMode = InterpolationMode.HighQualityBicubic; 

     Rectangle oRectangle = new Rectangle(0, 0, PictureThumbSize.Width, PictureThumbSize.Height); 

     oGraphic.DrawImage(oImg, oRectangle); 
     } 
     return oThumbNail; 
    } 
    //oThumbNail.Save(sPhysicalPath + @"\" + newFileName, ImageFormat.Jpeg); 
    } 
    catch (Exception Ex) 
    { 
    return null; 
    } 

} 
+0

я дал код изменения размера в сообщении, пожалуйста, отметьте –

+0

add oGraphic.Dispose(); – Swift

+0

Я сделал, та же проблема –

1

Вызов Dispose на вашем графике объекта, а также.

Смежные вопросы