2012-03-23 5 views
0

ウォーターマーク応答を返すハンドラと関数を記述しました。しかし、イメージがどのように読取り専用に変わるか。イメージを読み取り専用イメージに変換する

私はすべてのオブジェクトを配置しました。

コードは以下の通りです:

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

を次のように

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

と機能が書き込み画像にあるが、私は何かが足りないのですか?

答えて

0

Iから画像を作成することができますロックを避けるために:あなたのような「使用」「ついに」セクションに廃棄または使用するために電話を入れなければなりません私の問題を解決しました。私はなぜそれが働いたのかわかりませんが、それは働いています。

 
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

ご回答ありがとうございます。あなたが言っているのは書き込みです。しかし、上記のコードは例外なくファイルをロックします。 –

+0

イメージファイルをストリームにロードしてから、stremからイメージを作成することもできます。私は答えにサンプルを追加しました – Nikolay

関連する問題