0

この問題で誰かが私を助けてくれることを願っています..

ディレクトリから画像ファイルを取得し、同じディレクトリに保存した後、何かを描画するときにいくつかの処理を行う簡単なaspxコードがあります。

実際、コードはローカル マシンではうまく機能しましたが、サーバー側ではコードが失敗し、例外が表示されます。( ArgumentException: パラメータが無効です )

コードを見てください:

DirectoryInfo[] dir = new DirectoryInfo[2];
dir[0] = new DirectoryInfo(Server.MapPath("Image/DB/Large/"));
dir[1] = new DirectoryInfo(Server.MapPath("Image/DB/Thumb/"));

System.Drawing.Image signature = System.Drawing.Image.FromFile(Server.MapPath("Image/Design/signature.png"));
for (int i = 0; i < dir.Length; i++)
{
    FileInfo[] fs = dir[i].GetFiles("*.jpg");
    foreach (FileInfo s in fs)
    {
        FileStream strm = s.OpenRead();
        String name = s.Name;
        System.Drawing.Image img = System.Drawing.Image.FromStream(strm);
        Graphics g = Graphics.FromImage(img);
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.DrawImage(signature, new Point(0, 0));       
        strm.Close();
        if (i == 0)
        {
            String v = Server.MapPath("Image/DB/Large/" + name);
            img.Save(v);
        }
        else if (i == 1)
        {
            String v = Server.MapPath("Image/DB/Slide/" + name);
            img.Save(v);
        }
        g.Dispose();         
    }
}

例外の詳細:

パラメータが無効です。説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.ArgumentException: パラメーターが無効です。

  Source Error:

  An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

  Stack Trace:


[ArgumentException: Parameter is not valid.]
   System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData) +1062843
   System.Drawing.Image.FromStream(Stream stream) +8
   Developer.Button1_Click(Object sender, EventArgs e) +279
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565
4

1 に答える 1

3

FileStreamをStreamに変換する必要があります

System.Drawing.Image.FromStream(..);// This method take Stream as argument and nor FileStream

変換するために、CopyToで試すことができます。

リンク: http: //msdn.microsoft.com/en-us/library/dd782932.aspx

FileStream strm = s.OpenRead();
Stream stream = new Stream();
strm.CopyTo(stream);
System.Drawing.Image.FromStream(stream);

.Net 4より前では、この拡張メソッドを使用できます

public static class Ext {

public static void CopyTo(this FileStream in, Stream out)
{
    byte[] temp= new byte[16*1024]; //You can adjust this value
    int bytesRead;

    while ((bytesRead = in.Read(temp,0, temp.Length)) > 0)
    {
        out.Write(temp, 0, bytesRead);
    }
}

}

于 2012-09-25T18:40:49.237 に答える