27

次のコードブロックを使用し、usingブロック内にさらにいくつかのコードを追加します。

using (System.Drawing.Bitmap tempImg =
       (System.Drawing.Bitmap)tempObj.GetData(System.Windows.Forms.DataFormats.Bitmap))
{
    // ...
    tempImg.Save("..\\..\\testdata\\tempImg.bmp", ImageFormat.Bmp);                            
    // ...
}

しかし、それでもエラーが発生します。

GDI+で一般的なエラーが発生しました

usingブロック内のコードに関係のないアクションを実行した後でのみ。それ以外の場合、これはうまく機能します。また、tempImg.bmpは一時ファイルなので、usingブロック自体のtempImg.bmpを削除します。

tempImgは使用中にあり、これは廃棄されているので、ロックの問題は解決されるべきだと思います。

誰かがこのコードの間違いを教えてもらえますか?

編集: System.Drawing.ImageSystem.Drawing.BitmapタイプとしてtempImg

Edit: I have identified I get this error only after SaveFileDialog is created and user clicks on 'Save'.

4

11 に答える 11

41

最後に、コードのどこが間違っていたのかを見つけることができました。誰かに役立つかもしれないと思うので、ここで言及したいと思います....

tempImg.Save で相対パスを指定したため、ユーザーが SaveFileDialog で [保存] をクリックすると、tempImg.Save の実際のパスは次のようになります。

SaveFileDialog で指定したパス + 相対パス

自動的。

したがって、パスが存在しない場合、このエラーが発生します。

答えてくれてありがとう。

于 2011-05-05T09:30:28.303 に答える
20

私も一度この問題を抱えていました-ビットマップがロックされて保存できないために発生します(正確な説明を見つけることができます)ので、とにかく修正はこれです:元のビットマップのサイズの新しいビットマップを作成します元のビットマップを新しく作成したビットマップにコピーしてから、元のビットマップを破棄して新しいビットマップを保存します。

Bitmap bm3 = new Bitmap(bm2);

そして保存します。

于 2011-04-28T08:55:27.840 に答える
5

これは通常、別の何か、場合によってはアプリケーション内の別のスレッドによって、保存しようとしているターゲット ファイルがファイル システム レベルでロックされていることを示しています。内部例外を見ると、これについて言及する必要があると思います。InnerException に直接含まれていない場合、これを確認する (または代わりにそれが実際に何であるかを発見する) 別の方法は、デバッガーで最初のチャンスの例外をオンにし、「下」でスローされている例外を監視することです。一般的な例外。

于 2011-04-28T05:01:19.470 に答える
5

ここに記載されているすべての解決策を試しましたが、無駄でした。最終的に解決策を見つけました。

  1. 画像に適用されたグラフィックスを破棄します。g.dispose();
  2. 保存パスが存在することを確認してください:System.IO.Directory.Exists(dir);
于 2012-08-15T01:26:44.753 に答える
1

私の場合、それは 1 つの DLL を置き換えた ASP.NET アプリケーションであり、デプロイ後にアプリケーション プールを再起動するだけで済みました。その後、うまくいきました。

于 2016-08-19T07:15:04.130 に答える
1

これは ASP.NET アプリケーションですか?

一般的なエラーは、asp.net の GDI+ で発生しました。主な原因は、ターゲット フォルダー/アクセス許可がないことです。

また、コードを次のように簡略化できます。

       using (Image image= dataObject.GetImage())
       {
            if (image != null)
            {
                image.Save("test.bmp");
            }
        }
于 2011-04-28T05:28:43.343 に答える
0

bitMap画像を保存した後、オブジェクトを破棄します。

 bitMap.Dispose()
 oimg.Dispose()

 bitMap = Nothing
 oimg = Nothing
于 2015-05-19T09:15:26.703 に答える
0

これは、Microsoft フォーラムのコード サンプルです。

// new image with transparent Alpha layer
using (var bitmap = new Bitmap(330, 18, PixelFormat.Format32bppArgb))
{
    using (var graphics = Graphics.FromImage(bitmap))
    {
        // add some anti-aliasing
        graphics.SmoothingMode = SmoothingMode.AntiAlias;

        using (var font = new Font("Arial", 14.0f, GraphicsUnit.Pixel))
        {
            using (var brush = new SolidBrush(Color.White))
            {
                // draw it
                graphics.DrawString(user.Email, font, brush, 0, 0);
            }
        }
    }

    // setup the response
    Response.Clear();
    Response.ContentType = "image/png";
    Response.BufferOutput = true;

    // write it to the output stream
    bitmap.Save(Response.OutputStream, ImageFormat.Png);
    Response.Flush();
}
于 2011-04-28T06:37:53.577 に答える