C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: アニメGIFをファイルをロックせずに表示したい


(過去ログ 72 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■42363 / inTopicNo.1)  アニメGIFをファイルをロックせずに表示したい
  
□投稿者/ める (15回)-(2009/10/14(Wed) 11:34:56)

分類:[C#] 

いつもお世話になっています。

PictureBoxにアニメGIFを貼りたく、
以下のサイトを参考にソースを書いてみました。

http://jeanne.wankuma.com/tips/csharp/image/picturebox.html

--------------------------------
    // FileStream を開く
    System.IO.FileStream hStream = new System.IO.FileStream("C:\img.gif", System.IO.FileMode.Open);

    // FileStream から画像を読み込んで表示
    this.pictureBox1.Image = Image.FromStream(hStream);
    //this.pictureBox1.Image = Image.FromFile("C:\img.gif"); // ☆表示されるけどファイルロック

    // FileStream を閉じる (正しくは オブジェクトの破棄を保証する を参照)
    hStream.Close();
---------------------------------

実行すると、表示した直後に(多分アニメが動き始めた瞬間?)に
「GDI+ で汎用エラーが発生しました。」のエラーメッセージが出て
異常終了してしまいます。
また、☆の行を有効にすると表示は出来るのですが、
ファイルがロックされてしまいます。

ファイルをロックせずにアニメGIFを表示させる方法は
どのようにすれば良いのでしょうか?

環境はVisualStudio2005/C#/.net2.0です。
よろしくお願いします。

引用返信 編集キー/
■42365 / inTopicNo.2)  Re[1]: アニメGIFをファイルをロックせずに表示したい
□投稿者/ Hongliang (484回)-(2009/10/14(Wed) 11:52:05)
直接 FileStream から Image を作るのではなく、一旦 MemoryStream に中身をコピーしそれを使って Image.FromStream で作るようにしましょう。
引用返信 編集キー/
■42367 / inTopicNo.3)  Re[2]: アニメGIFをファイルをロックせずに表示したい
□投稿者/ 倉田 有大 (743回)-(2009/10/14(Wed) 12:19:19)
スレ主ではないが、なるほどっと納得。
引用返信 編集キー/
■42373 / inTopicNo.4)  Re[2]: アニメGIFをファイルをロックせずに表示したい
□投稿者/ める (16回)-(2009/10/14(Wed) 13:52:31)
No42365 (Hongliang さん) に返信
> 直接 FileStream から Image を作るのではなく、一旦 MemoryStream に中身をコピーしそれを使って Image.FromStream で作るようにしましょう。

返信ありがとうございます。
試してみましたが、やはり「GDI+ で汎用エラーが発生しました。」
のエラーが発生してしまいます。
MemoryStreamを初めてで、この使い方であっているかわかりませんが、
データはコピーされているようです。

元々のアニメGIFに問題があるとかでしょうか?
----------------------
            FileStream sr = null;
            MemoryStream ms = null;

            // アイコンファイル名
            string iconName = this.ImgBaseName + ".bmp";

            while (true)
            {
                // アイコンファイルへのフルパスを作成
                string IconFullPath = Path.Combine(System.Windows.Forms.Application.StartupPath, iconName);

                try
                {
                    // 各種イメージファイルを読み込む
                    sr = new FileStream(IconFullPath, FileMode.Open, FileAccess.Read);

                    // MemoryStreamを生成しファイルの内容をコピー
                    ms = new MemoryStream();
                    ms.SetLength(sr.Length);
                    sr.Read(ms.GetBuffer(), 0, (int)sr.Length);
                    ms.Flush();

                    this.picImg.Image = Image.FromStream(ms);
                    iconName = string.Empty;
                }
                catch (FileNotFoundException)
                {
                    // bmp→gif→jpgの順番で検索する。
                    if (iconName.Contains(".jpg"))
                    {
                        iconName = string.Empty;
                    }
                    else if (iconName.Contains(".bmp"))
                    {
                        iconName = this.ImgBaseName + ".gif";
                    }
                    else if (iconName.Contains(".gif"))
                    {
                        iconName = this.ImgBaseName + ".jpg";
                    }
                }
                catch (ArgumentException)
                {
                    // 何もしない。
                }
                finally
                {
                    //ストリームを閉じる
                    if (ms != null) ms.Close();
                    if (sr != null) sr.Close();
                }

                // アイコン名が空でない場合は続行
                if (iconName.Length != 0)
                {
                    continue;
                }

                break;
            }
----------------

引用返信 編集キー/
■42374 / inTopicNo.5)  Re[3]: アニメGIFをファイルをロックせずに表示したい
□投稿者/ める (17回)-(2009/10/14(Wed) 13:58:50)
すみません。自己解決しました。

MemoryStreamをClose()してしまっていました。

-------------------------
finally
{
//ストリームを閉じる
//if (ms != null) ms.Close();
if (sr != null) sr.Close();
}
-------------------------

と、言うか、
this.picTabooImg.Image = Image.FromStream(ms);
の時点で内部的にコピーとかされていないものなのですね。

ここで使用してる「ms」ですが、
メソッド内で宣言してしまっているので、
外では明示的な開放って出来ませんが、
やはりお作法としては、フィールドで持って
最後にClose()すべきでしょうか?


引用返信 編集キー/
■42375 / inTopicNo.6)  Re[4]: アニメGIFをファイルをロックせずに表示したい
□投稿者/ Hongliang (485回)-(2009/10/14(Wed) 14:09:46)
作成した Image を Dispose するときに自動的に基となった MemoryStream も Close されるので、放っておいて構いません。
// まあそもそも MemoryStream は特に Close でやる処理もないはずなんで気にする必要もないですが。
逆に、PictureBox.Image を差し替えるときは、以前に表示していた Image を Dispose するように心がけましょう。

> 元々のアニメGIFに問題があるとかでしょうか?
で、また別に、そういう可能性もあります。
PictureBox.Image が利用する ImageAnimator クラスは、いささか質がよろしくないので。
この掲示板の記事を私の名前と GIF で検索すればその辺見つかると思います。
引用返信 編集キー/
■42376 / inTopicNo.7)  Re[5]: アニメGIFをファイルをロックせずに表示したい
□投稿者/ める (19回)-(2009/10/14(Wed) 14:17:02)
No42375 (Hongliang さん) に返信
> 作成した Image を Dispose するときに自動的に基となった MemoryStream も Close されるので、放っておいて構いません。
> // まあそもそも MemoryStream は特に Close でやる処理もないはずなんで気にする必要もないですが。
> 逆に、PictureBox.Image を差し替えるときは、以前に表示していた Image を Dispose するように心がけましょう。

了解しました。丁寧な回答ありがとうございました。

>>元々のアニメGIFに問題があるとかでしょうか?
アニメGIFは表示されたのでとりあえず今回の
データは大丈夫そうです(^^;

> PictureBox.Image が利用する ImageAnimator クラスは、いささか質がよろしくないので。
> この掲示板の記事を私の名前と GIF で検索すればその辺見つかると思います。
今後の為に読ませていただきます。

ありがとうございました。重ねて御礼申し上げます。m(__)m
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -