2012-03-23 23 views
0

我寫了一個處理程序,併發送水印響應返回的功能。但一些圖像如何更改爲只讀。寫作上的圖像轉換成圖像只讀

我已設置的所有的對象。

的代碼如下:

public void ProcessRequest(HttpContext context) 
{ 
    var imagePath = QueryString.getValueOf("ID"); 
    var watermark = QueryString.getValueOf("watermark"); 
    context.Response.ContentType = "image/jpeg"; 
    if (string.IsNullOrWhiteSpace(imagePath) || string.IsNullOrWhiteSpace(watermark)) 
    { 
    var originalImage = Image.FromFile(context.Server.MapPath("Images/NoImage.jpg")); 
    originalImage.Save(context.Response.OutputStream, ImageFormat.Jpeg); 
    originalImage.Dispose(); 
    } 
    else 
    { 
    if (watermark == "0") 
    { 
     var absolutePath = context.Server.MapPath(imagePath); 
     var fileexist = System.IO.File.Exists(absolutePath); 
     if (fileexist) 
     { 
     var originalImage = Image.FromFile(absolutePath); 
     originalImage.Save(context.Response.OutputStream, ImageFormat.Jpeg); 
     originalImage.Dispose(); 
     } 
     else 
     { 
     var originalImage = Image.FromFile(context.Server.MapPath("Images/NoImage.jpg")); 
     originalImage.Save(context.Response.OutputStream, ImageFormat.Jpeg); 
     originalImage.Dispose(); 
     } 
    } 
    else 
    { 
     if (imagePath.ToUpper().Contains(".GIF")) 
     { 
     var absolutePath = context.Server.MapPath(imagePath); 
     var fileexist = System.IO.File.Exists(absolutePath); 
     if (fileexist) 
     { 
      var originalImage = Image.FromFile(absolutePath); 
      originalImage.Save(context.Response.OutputStream, ImageFormat.Jpeg); 
      originalImage.Dispose(); 
     } 
     else 
     { 
      var originalImage = Image.FromFile(context.Server.MapPath("Images/NoImage.jpg")); 
      originalImage.Save(context.Response.OutputStream, ImageFormat.Jpeg); 
      originalImage.Dispose(); 
     } 
     } 
     else 
     { 
     var absolutePath = context.Server.MapPath(imagePath); 
     var fileexist = System.IO.File.Exists(absolutePath); 
     if (fileexist) 
     { 
      var originalImage = Image.FromFile(absolutePath); 
      originalImage = new ImageMethods().AddWatermarkText(originalImage); 
      originalImage.Save(context.Response.OutputStream, ImageFormat.Jpeg); 
      originalImage.Dispose(); 
     } 
     else 
     { 
      var originalImage = Image.FromFile(context.Server.MapPath("Images/NoImage.jpg")); 
      originalImage.Save(context.Response.OutputStream, ImageFormat.Jpeg); 
      originalImage.Dispose(); 
     } 
     } 
    } 
    } 
} 

和功能是寫入圖像是如下

public Image AddWatermarkText(Image img) 
{ 
    try 
    { 
    var textOnImage = ConfigurationManager.AppSettings["textOnImage"]; 
    var opacity = Int32.Parse(ConfigurationManager.AppSettings["opicity"]); 
    var red = Int32.Parse(ConfigurationManager.AppSettings["red"]); 
    var green = Int32.Parse(ConfigurationManager.AppSettings["green"]); 
    var blue = Int32.Parse(ConfigurationManager.AppSettings["blue"]); 
    var fontSize = Int32.Parse(ConfigurationManager.AppSettings["fontSize"]); 
    var fontName = ConfigurationManager.AppSettings["fontName"]; 

    var lobFromImage = Graphics.FromImage(img); 
    var lobFont = new Font(fontName, fontSize, FontStyle.Regular); 
    var lintTextHw = lobFromImage.MeasureString(textOnImage, lobFont); 
    var lintTextOnImageWidth = (int)lintTextHw.Width; 
    var lintTextOnImageHeight = (int)lintTextHw.Height; 
    var lobSolidBrush = new SolidBrush(Color.FromArgb(opacity, Color.FromArgb(red, green, blue))); 

    var posLeft = (img.Width - lintTextOnImageWidth)/2; 
    posLeft = posLeft > 0 ? posLeft : 5; 
    var lobPoint = new Point(posLeft, (img.Height/2) - (lintTextOnImageHeight/2)); 

    // var lobPoint = new Point(RandomNumber(0, img.Width - lintTextOnImageWidth), RandomNumber(0, img.Height - lintTextOnImageHeight)); 
    lobFromImage.DrawString(textOnImage, lobFont, lobSolidBrush, lobPoint); 

    lobFromImage.Dispose(); 
    lobSolidBrush.Dispose(); 
    lobFont.Dispose(); 
    } 
    catch (Exception ex) 
    { 
    HavException = true; 
    ExceptionMessage = ex.Message; 
    } 
    return img; 
} 

我缺少的東西?

回答

0

創建圖像解決了我的問題。我不知道爲什麼它的工作,但它的工作。

 
public void ProcessRequest(HttpContext context) 
     { 
      var imagePath = QueryString.getValueOf("ID"); 
      var watermark = QueryString.getValueOf("watermark"); 
      string lstrResponseType; 
      // context.Response.ContentType = "image/jpeg"; 
      if (string.IsNullOrWhiteSpace(imagePath) || string.IsNullOrWhiteSpace(watermark)) 
      { 
       using (var originalImage = Image.FromFile(context.Server.MapPath("Images/NoImage.jpg"))) 
       { 
        originalImage.Save(context.Response.OutputStream, ImageFormat.Jpeg); 
        originalImage.Dispose(); 
       } 
       lstrResponseType = "image/jpeg"; 
      } 
      else 
      { 

       var absolutePath = context.Server.MapPath(imagePath); 
       var fileexist = System.IO.File.Exists(absolutePath); 
       if (!fileexist) 
       { 
        var originalImage = Image.FromFile(context.Server.MapPath("Images/NoImage.jpg")); 
        originalImage.Save(context.Response.OutputStream, ImageFormat.Jpeg); 
        lstrResponseType = "image/jpeg"; 
        originalImage.Dispose(); 
       } 
       else 
       { 
        using (var originalImage = Image.FromFile(absolutePath)) 
        { 

         if (watermark == "0") 
         { 
          originalImage.Save(context.Response.OutputStream, ImageFormat.Jpeg); 
          lstrResponseType = "image/jpeg"; 
         } 
         else 
         { 
          if (imagePath.ToUpper().Contains(".GIF")) 
          { 
           originalImage.Save(context.Response.OutputStream, ImageFormat.Gif); 
           lstrResponseType = "image/gif"; 
          } 
          else 
          { 

           new ImageMethods().AddWatermarkText(originalImage); 
           originalImage.Save(context.Response.OutputStream, ImageFormat.Jpeg); 
           lstrResponseType = "image/jpeg"; 

          } 
         } 
        } 
       } 
      } 
      context.Response.ContentType = lstrResponseType; 
     } 

1

如果你有你的Dispose調用之前的異常,然後你的圖像將不設置和文件都將保持鎖定。你應該把電話「終於」一節中,以處置或使用「使用」,如:

using (var originalImage = Image.FromFile(absolutePath)) 
    originalImage.Save(context.Response.OutputStream, ImageFormat.Jpeg); 

同時,爲了避免鎖定您可以讀取文件先流,然後從流

using(var imageStream = new FileStream(fileName, FileMode.Open, FileAccess.Read)) 
    return Image.FromStream(imageStream); 
+0

感謝您的回覆。你說的是寫。但上面的代碼鎖定無任何異常的文件。 – 2012-03-23 10:58:27

+0

您也可以嘗試將圖像文件第一次加載到流,然後自Strem創建圖像。我在我的答案中添加了示例 – Nikolay 2012-03-23 13:49:07