web-dev-qa-db-ja.com

SaveFileDialogを使用した後、Bitmap.Save()のGDI +で一般的なエラーが発生する

次のコードブロックを使用し、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.ImageからSystem.Drawing.BitmapのタイプとしてtempImg

編集: SaveFileDialogが作成され、ユーザーが「保存」をクリックした後にのみ、このエラーが発生することがわかりました。

26
Dulini Atapattu

最後に、コードのどこに問題があるのか​​を見つけることができました。誰かに役立つと思うので、ここで言及したいと思います。

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

SaveFileDialogで指定されたパス+相対パス

自動的に。

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

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

40
Dulini Atapattu

私も一度この問題を抱えていました-ビットマップがロックされて保存できないため(正確な説明が必要な場合)、とにかくこれは次のように修正されます:元のビットマップを新しく作成したビットマップにコピーしてから、元のビットマップを破棄して新しいビットマップを保存します。

Bitmap bm3 = new Bitmap(bm2);

そして保存します。

20
Eli Braginskiy

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

5
Drew Marsh

ここで与えられたすべてのソリューションを試してみましたが、無駄でした。最終的に解決策を見つけました。

  1. 画像に適用されたグラフィックを破棄します:g.dispose();
  2. 保存パスが存在することを確認してください:System.IO.Directory.Exists(dir);
4
Umar Hassan

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

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

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

       using (Image image= dataObject.GetImage())
       {
            if (image != null)
            {
                image.Save("test.bmp");
            }
        }
1
Vijay Sirigiri

私の場合、それは単一のDLLを置き換えたASP.NETアプリケーションであり、展開後にアプリケーションプールを再起動する必要がありました。それからそれはうまく働きました。

1
Fabian

一般的に、フォルダが保護されているか、ファイル名が無効である場合、Bitmap.Save()のGDI +で一般的なエラーが発生します。

一般的なエラーは、名前を作成することを忘れて、フォルダ名だけを書き込むことです。

1
Kishore Sathia

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

 bitMap.Dispose()
 oimg.Dispose()

 bitMap = Nothing
 oimg = Nothing
0
Lokesh Yadav

画像タイプ「.bmp」を「.png」に変更することで、同じ問題に直面していました

0
Niraj Trivedi

これは、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();
}
0
v00d00

リソースから画像を保存しようとしていますが、Bitmap.Save(filepath)メソッドを直接使用すると、GDIエラーが発生します。他のビットマップにも同じ下のコードを使用できると思いますクローンを作成してイメージを作成します。

Private void SaveResourceImage() {
    object resBmpObject = Resource.Image1.Clone();//Bitmap Image from resource file
    //object resBmpObject = anyBmpImage.clone(); //for image other than resource image
    Bitmap resBmpImage = (Bitmap)resBmpObject;
    resBmpImage.Save(destFilePath, System.Drawing.Imaging.ImageFormat.Png);
    resBmpImage.dispose();
}
0
RoopzD

私の場合、ソースと同じ場所にビットマップファイルを保存していました。それが問題です。ビットマップを新しい場所に保存しました。

0
saurabh_hcl