2016-08-11 1 views
1

다른 이미지가 포함 된 폴더의 파일을 워터 마킹하고 싶습니다. 그러나Image.Save 매개 변수가 유효하지 않습니다.

'매개 변수 유효하지'오류를 얻고있다

코드

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

나는 다음과 같은 코드를 가지고;

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"; 
    } 

및 img.save위한 입력의 일례

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; 
     } 
    } 

;

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

여기에 오류의 원인이 될 수있는 아이디어가 있으십니까?

+0

이 기능을 'GetJpgFilesFromFolder' – naveen

답변

2

WatermarkImage에서 using 문에 이미지 개체가 있습니다. 범위를 벗어나면 Dispose가 이미지에서 호출됩니다. 이미지의 복사본을 반환해야합니다. 또는 사용 문을 사용하지 마십시오. & 나중에 제대로 처리 할 수 ​​있습니다.

참조 : 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

에 표시해 주셔서 감사합니다. 나무 용 나무를 볼 수 없었습니다. –

0

사진 스트림을 사용 할 수있는 기능을 제공합니다,하지만 그것이 현재 내 예와 같이 검도 Control에서 찾아 볼 것 같은 위치와 여전히 물리적하지 않은 내 대체 솔루션이며, 아직 위치가 없습니다.

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"); 
    }