2

ユーザーがフォームで [チームを保存] を押したときに、ユーザーがアップロードした画像を [ロゴ] ファイルに保存する際に問題が発生しました。

アプリケーションが何をするかを知るために、ここにスクリーンショットを用意しました。[チームを追加] を押すと、すべてのテキスト ボックスのデータがテキスト ファイルに書き込まれ、事前定義されたフォルダー「logos」に画像が自動的に保存されるようにします。保存を押すたびに GDI++ エラーが発生します。

Web 上のいくつかの古いスレッドを読んだ後、ファイルのアクセス許可、ファイル サイズ、ファイル名、または開いているストリームなど、いくつかのことが原因である可能性があることがわかりました。

以下は、エラーを表示するファイルを保存するために現在使用しているコードです。

     private void btnAddTeam_Click(object sender, EventArgs e)
    {
        //VALIDATION FOR TEXT FILE AND OTHER STUFF HERE...

        //SAVE THE IMAGE FILE
        string filePath = picTeamLogo.ImageLocation;
        Image tempImage = Image.FromFile(filePath);

        tempImage.Save(@"../logos/");
    }

スクリーンショットを表示している場合は、「arsenal.png」と混同しないようにしてください。これが完全なファイル パスではないことは承知しています。ファイル名だけをテキストに書き込む必要があるため、変換は別の方法で処理されます。ファイル。

私が間違っている場所について何か考えがある場合は、正しい方向に向けてください。受け取ったばかりの GDI エラーなどの漠然としたエラーは頭痛の種です!


アレックス。

4

3 に答える 3

1

同様の問題については、私のこの以前の投稿を参照してください...

Bitmap.Save メソッドの GDI+ で一般的なエラーが発生しました

ストリームはロックされたままです。メモリ ストリームを一時的な場所として使用して保存できます。

Bitmap オブジェクトまたは Image オブジェクトのいずれかがファイルから構築される場合、ファイルはオブジェクトの存続期間中ロックされたままになります。そのため、イメージを変更して元のファイルに戻すことはできません。 http://support.microsoft.com/?id=814675

string outputFileName = "...";
using (MemoryStream memory = new MemoryStream())
{
    using (FileStream fs = new FileStream(outputFileName, FileMode.Create, FileAccess.ReadWrite))
    {
        tempImage.Save(memory, ImageFormat.Jpeg);
        // memory.ToStream(fs) // I think the same
        byte[] bytes = memory.ToArray();
        fs.Write(bytes, 0, bytes.Length);
    }
}

または、代わりにイメージを介してイメージをロードMemoryStreamすることです-したがって、ストリームは最初にロックされません...

于 2013-04-08T18:51:07.763 に答える
1

これは、保存機能のファイル名を指定していないためです。

これを見てください :

string filePath = picTeamLogo.ImageLocation;
FileInfo fi = new FileInfo(filePath);
Image tempImage = Image.FromFile(fi.FullName);
tempImage.Save(@"../logo/" + fi.Name);

今では正常に動作します

于 2013-04-08T19:01:02.137 に答える