2016-08-11 8 views
1

Ich möchte Dateien in einem Ordner mit einem anderen Bild mit Wasserzeichen versehen. Aber ich erhalte die FehlerImage.Save Parameter nicht gültig

'Parameter nicht gültig'

, wenn Sie den Code Aufruf

img.Save(filepath, System.Drawing.Imaging.ImageFormat.Jpeg); 

ich den folgenden Code haben;

public static string WatermarkImagesInFolder(string url) 
    { 
     if (url == null) 
      throw new Exception("URL must be provided"); 

     string path = HttpContext.Current.Server.MapPath(url); 

     if (!Directory.Exists(path)) 
      throw new DirectoryNotFoundException(); 

     Directory.CreateDirectory(String.Format(@"{0}\watermarked", path)); 

     List<string> urls = GetJpgFilesFromFolder(path); 

     foreach (string imageUrl in urls) 
     { 
      Image img = WatermarkImage(imageUrl); 

      string filename = Path.GetFileName(imageUrl); 
      string filepath = String.Format(@"{0}\watermarked\{1}", path, filename); 
      img.Save(filepath, System.Drawing.Imaging.ImageFormat.Jpeg); 
     } 

     return "complete"; 
    } 

und

public static Image WatermarkImage(string filename) 
    { 
     using (Image image = Image.FromFile(filename)) 
     using (Image watermarkImage = Image.FromFile(HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["WatermarkImageUrl"]))) 
     using (Graphics imageGraphics = Graphics.FromImage(image)) 
     using (TextureBrush watermarkBrush = new TextureBrush(watermarkImage)) 
     { 
      int x = (image.Width/2 - watermarkImage.Width/2); 
      int y = (image.Height/2 - watermarkImage.Height/2); 
      watermarkBrush.TranslateTransform(x, y); 
      imageGraphics.FillRectangle(watermarkBrush, new Rectangle(new Point(x, y), new Size(watermarkImage.Width + 1, watermarkImage.Height))); 
      return image; 
     } 
    } 

als Beispiel einer Eingabe für img.save;

img.save("C:\\IMAGES\\wateremarked\\IMAGE (1).jpg", System.Drawing.Imaging.ImageFormat.Jpeg); 

irgendwelche Ideen auf was könnte den Fehler hier bitte verursachen?

+0

zeigen Sie bitte diese Funktion 'GetJpgFilesFromFolder' – naveen

Antwort

2

In Ihrem WatermarkImage haben Sie das Bildobjekt in einer using-Anweisung. Sobald dies nicht mehr möglich ist, wird Dispose auf dem Bild aufgerufen. Sie müssten eine Kopie des Bildes zurückgeben - oder verwenden Sie nicht die Verwendung Anweisung & sicherzustellen, dass Sie später ordnungsgemäß entsorgen.

See: Exception: Parameter is not valid (on passing new image to pictureBox)

public static string WatermarkImagesInFolder(string url) 
{ 
    if (url == null) 
     throw new Exception("URL must be provided"); 

    string path = HttpContext.Current.Server.MapPath(url); 

    if (!Directory.Exists(path)) 
     throw new DirectoryNotFoundException(); 

    Directory.CreateDirectory(String.Format(@"{0}\watermarked", path)); 

    List<string> urls = GetJpgFilesFromFolder(path); 

    foreach (string imageUrl in urls) 
    { 
     using(Image img = WatermarkImage(imageUrl)) 
     { 
     string filename = Path.GetFileName(imageUrl); 
     string filepath = String.Format(@"{0}\watermarked\{1}", path, filename); 
     img.Save(filepath, System.Drawing.Imaging.ImageFormat.Jpeg); 
     } 
    } 

    return "complete"; 
} 

public static Image WatermarkImage(string filename) 
{ 
    Image image = Image.FromFile(filename); 
    using (Image watermarkImage = Image.FromFile(HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["WatermarkImageUrl"]))) 
    using (Graphics imageGraphics = Graphics.FromImage(image)) 
    using (TextureBrush watermarkBrush = new TextureBrush(watermarkImage)) 
    { 
     int x = (image.Width/2 - watermarkImage.Width/2); 
     int y = (image.Height/2 - watermarkImage.Height/2); 
     watermarkBrush.TranslateTransform(x, y); 
     imageGraphics.FillRectangle(watermarkBrush, new Rectangle(new Point(x, y), new Size(watermarkImage.Width + 1, watermarkImage.Height))); 
     return image; 
    } 
} 
+0

Dank für den Hinweis. Konnte das Holz für die Bäume nicht sehen. –

0

Hier ist meine alternative Lösung, die die Fähigkeit Strom zu verwenden Bildes gibt, aber es ist nicht Lage, da es zur Zeit von Kendo Steuerung wie in meinem Beispiel durchsucht hat und es immer noch nicht körperliches Standort noch nicht.

public static Image ApplyWatermark(HttpPostedFileBase img, string appDataPath) 
{ 
    Image resultImage = null; 
    using (Image image = Image.FromStream(img.InputStream)) 
    { 
     using (Image watermarkImage = Image.FromFile(appDataPath + "\\Watermark\\sample-watermark.png")) 
     { 
      using (Graphics imageGraphics = Graphics.FromImage(image)) 
      { 
       using (Brush watermarkBrush = new TextureBrush(watermarkImage)) 
       { 
        imageGraphics.FillRectangle(watermarkBrush, new Rectangle(new Point(0, 0), image.Size)); 
        resultImage = (Image)image.Clone(); 
       } 
      } 
     } 
    } 

    return resultImage; 
} 

private void SaveImagesOnDisk(IEnumerable<HttpPostedFileBase> images, int rentalPropertyId) 
    { 
     if (images != null) 
     { 
      foreach (var file in images) 
      { 
       // Some browsers send file names with full path. This needs to be stripped. 
       var fileName = Path.GetFileName(file.FileName); 
       var appDataPath = this.Server.MapPath("~/App_Data/"); 
       var newPath = Path.Combine(appDataPath, rentalPropertyId.ToString()); 
       if (!Directory.Exists(newPath)) 
       { 
        DirectoryInfo di = Directory.CreateDirectory(newPath); 
       } 

       var physicalPath = Path.Combine(newPath, fileName); 
       System.Drawing.Image markedImage = Helper.ApplyWatermark(file, appDataPath); 
       markedImage.Save(physicalPath, System.Drawing.Imaging.ImageFormat.Png); 
      } 
     } 

     //return this.Json(new { status = "OK" }, "text/plain"); 
    } 
Verwandte Themen