次のコードブロックを使用し、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が作成され、ユーザーが「保存」をクリックした後にのみ、このエラーが発生することがわかりました。
最後に、コードのどこに問題があるのかを見つけることができました。誰かに役立つと思うので、ここで言及したいと思います。
TempImg.Saveに相対パスを指定し、ユーザーがSaveFileDialogで「保存」をクリックすると、tempImg.Saveの実際のパスは次のようになります。
SaveFileDialogで指定されたパス+相対パス
自動的に。
したがって、パスが存在しない場合、このエラーが発生します。
答えてくれてありがとう。
私も一度この問題を抱えていました-ビットマップがロックされて保存できないため(正確な説明が必要な場合)、とにかくこれは次のように修正されます:元のビットマップを新しく作成したビットマップにコピーしてから、元のビットマップを破棄して新しいビットマップを保存します。
Bitmap bm3 = new Bitmap(bm2);
そして保存します。
これは通常、他の何か、場合によっては独自のアプリケーションの他のスレッドに、保存しようとしているターゲットファイルがファイルシステムレベルでロックされていることを示すインジケータです。内側の例外を見ると、これに言及すべきだと思います。 InnerExceptionに直接ない場合これを確認する別の方法(または実際に代わりになる可能性があるものを発見する)は、デバッガーで最初のチャンスの例外をオンにし、どの例外が「下」にスローされているかを監視することです。一般的な例外。
ここで与えられたすべてのソリューションを試してみましたが、無駄でした。最終的に解決策を見つけました。
g.dispose();
System.IO.Directory.Exists(dir);
これはASP.NETアプリケーションですか?
Asp.netのGDI +で一般的なエラーが発生したのは、主にターゲットフォルダー/アクセス許可がないためです。
また、コードは次のように簡略化できます。
using (Image image= dataObject.GetImage())
{
if (image != null)
{
image.Save("test.bmp");
}
}
私の場合、それは単一のDLLを置き換えたASP.NETアプリケーションであり、展開後にアプリケーションプールを再起動する必要がありました。それからそれはうまく働きました。
一般的に、フォルダが保護されているか、ファイル名が無効である場合、Bitmap.Save()のGDI +で一般的なエラーが発生します。
一般的なエラーは、名前を作成することを忘れて、フォルダ名だけを書き込むことです。
画像を保存した後、bitMap
オブジェクトを破棄します。
bitMap.Dispose()
oimg.Dispose()
bitMap = Nothing
oimg = Nothing
画像タイプ「.bmp」を「.png」に変更することで、同じ問題に直面していました
これは、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();
}
リソースから画像を保存しようとしていますが、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();
}
私の場合、ソースと同じ場所にビットマップファイルを保存していました。それが問題です。ビットマップを新しい場所に保存しました。