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

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

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

Re[2]: 画像の繰り返し表示時にメモリ不足


(過去ログ 131 を表示中)

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

■77170 / inTopicNo.1)  画像の繰り返し表示時にメモリ不足
  
□投稿者/ ぶぶ (6回)-(2015/09/18(Fri) 17:00:54)

分類:[VB.NET/VB2005 以降] 

2015/09/18(Fri) 17:01:55 編集(投稿者)
2015/09/18(Fri) 17:01:44 編集(投稿者)

VB2010 Windows7 で開発をしています。

【画像の任意座標部分の切り取りについて】で教えて頂いたコードから、

今回は、その処理を繰り返し使用しようとしています。
画像の大きさは3300×2334ピクセルです。

Imports System.Drawing.Drawing2D

Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click


for i = 1 to 100
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height) '☆☆☆
Dim g As Graphics = Graphics.FromImage(canvas)


Dim bmp As New Bitmap("e:\~01_VisualBasicサンプルPG作成\20150907_vb2010_画像Clip\clip_Bmp.bmp")
g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height)
bmp.Dispose()

' <<<<-------画像を部分的に切り取ったり、ピクセル数を数えたりする処理

  ' ----- 描画先
   Dim cut_canvas As New Bitmap(PictureBox2.Width, PictureBox2.Height)  '☆☆☆
   Dim cut_g As Graphics = Graphics.FromImage(cut_canvas)

   cut_g.Clip = rgn
   cut_g.DrawImage(canvas, 0, 0)

   PictureBox2.Image = cut_canvas
   cut_g.Dispose()
   rgn.Dispose()
   g.Dispose()
next i

End Sub
End Class

一部省略したりしていますが、このような流れで処理を行っています。
'☆☆☆
の部分の箇所で、メモリ不足であったり、使用されたパラメーターが有効ではありません。の
メッセージを表示します。

dispose()も実行していますが、サイズが大きい画像を繰り返し表示するのは難しいのでしょうか?

引用返信 編集キー/
■77172 / inTopicNo.2)  Re[1]: 画像の繰り返し表示時にメモリ不足
□投稿者/ ito (1回)-(2015/09/18(Fri) 17:14:15)
No77170 (ぶぶ さん) に返信
>    Dim cut_canvas As New Bitmap(PictureBox2.Width, PictureBox2.Height)  '☆☆☆
>    PictureBox2.Image = cut_canvas
PictureBox2.Image と cut_canvasがDisposeされていませんね。

VBは門外漢なので、C#コードになりますがこんな感じでしょうか。
    Bitmap oldBmp = PictureBox2.Image;
    PictureBox2.Image = cut_canvas;
    oldBmp.Dispose();

それと、このように大きなサイズを使用する場合には定期的にGCを回すようにしたほうが良いです。
    System.GC.Collect(System.GC.MaxGeneration);
    System.GC.WaitForPendingFinalizers();


引用返信 編集キー/
■77174 / inTopicNo.3)  Re[1]: 画像の繰り返し表示時にメモリ不足
□投稿者/ 魔界の仮面弁士 (505回)-(2015/09/18(Fri) 19:59:17)
この掲示板の利用ルールでは、
  『半角カナは使用しないでください。文字化けの原因になります。』
という事になっています。次回以降の投稿には含めぬよう、ご留意下さい。


No77170 (ぶぶ さん) に返信
> 今回は、その処理を繰り返し使用しようとしています。

Dispose しわすれているオブジェクトについては、
既に ito さんが指摘されていますが、それ以外で気になった点を:


> Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height) '☆☆☆

コードを見る限り、PictureBox1 のWidth/Height を読んでいるだけで、
PictureBox が持っている機能は一切使用されていないようですが、
省略されている部分のコードで、PictureBox1 が必要になっているのでしょうか。


>   PictureBox2.Image = cut_canvas
>   cut_g.Dispose()
>   rgn.Dispose()
>   g.Dispose()
> next i

これって、「ループ終了後」に表示される cut_canvas は、最後のひとつだけですよね。
毎回、PictureBox2.Image にセットしなおす必要はあるのでしょうか。



> clip_Bmp.bmp

ループ内で、毎回 New → Dispose していますが、同じ画像を使っているのなら、
ループ内で読み直す必要は無さそうです。ループの外でロードし、
その bmp を使いまわすわけにはいかないのでしょうか。
(複数枚同時に開くと、メモリ不足になるとか?)


> サイズが大きい画像を繰り返し表示するのは難しいのでしょうか?
> 画像の大きさは3300×2334ピクセルです。

16,060×4,100 の 256色 Bitmap とか、
8,192×8,192 の Jpeg を扱ったことならあります.
http://dobon.net/vb/bbs/log3-39/23844.html

ただ、それらを複数枚、繰り返し読み直したことは無いですね…。
引用返信 編集キー/
■77398 / inTopicNo.4)  Re[2]: 画像の繰り返し表示時にメモリ不足
□投稿者/ ぶぶ (7回)-(2015/10/16(Fri) 15:51:36)
返事が遅れました。
やっと解決致しましたので投稿致します。
No77172 (ito さん) に返信
>PictureBox2.Image と cut_canvasがDisposeされていませんね。
実際のソースを確認しましたが、Disposeしているつもりでした。
よくよく回答の内容を見てみましたら、PictureBox2.Dispose()としていました。
PictureBox2.Image.Dispose()としたところ、メモリ不足もおこらなくなりました。
ありがとうございました。

>それと、このように大きなサイズを使用する場合には定期的にGCを回すようにしたほうが良いです。
> System.GC.Collect(System.GC.MaxGeneration);
> System.GC.WaitForPendingFinalizers();
この件につきましても確認致します。
ありがとうございました。


No77174 (魔界の仮面弁士 さん) に返信

> この掲示板の利用ルールでは、
>   『半角カナは使用しないでください。文字化けの原因になります。』
> という事になっています。次回以降の投稿には含めぬよう、ご留意下さい。
申し訳ありません。以後きをつけます。

>>Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height) '☆☆☆
>
> コードを見る限り、PictureBox1 のWidth/Height を読んでいるだけで、
> PictureBox が持っている機能は一切使用されていないようですが、
> 省略されている部分のコードで、PictureBox1 が必要になっているのでしょうか。
はい。省略している箇所で利用しています。
>
>>  PictureBox2.Image = cut_canvas
>>  cut_g.Dispose()
>>  rgn.Dispose()
>>  g.Dispose()
>>next i
>
> これって、「ループ終了後」に表示される cut_canvas は、最後のひとつだけですよね。
> 毎回、PictureBox2.Image にセットしなおす必要はあるのでしょうか。
ループの中で、ファイルを読み込んでその内容により表示する画像が変わりますので、
毎回設定しなくてはなりませんでした。

> ループ内で、毎回 New → Dispose していますが、同じ画像を使っているのなら、
> ループ内で読み直す必要は無さそうです。ループの外でロードし、
> その bmp を使いまわすわけにはいかないのでしょうか。
> (複数枚同時に開くと、メモリ不足になるとか?)
毎回画像の内容が違うので、読み直す必要が生じました。
>
>
> 16,060×4,100 の 256色 Bitmap とか、
> 8,192×8,192 の Jpeg を扱ったことならあります.
> http://dobon.net/vb/bbs/log3-39/23844.html
>
> ただ、それらを複数枚、繰り返し読み直したことは無いですね…。
結局Picture2.Image.Disposeが抜けておりました。
Picture2.Dipose()を記述して、すっかりDisposeをした気持ちでいましたが、
結局Disposeの意味がよく理解できないままです。

お二人の回答により、よくよく見なおしてやっと現象がでなくなりました。
ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -