tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルビットマップのメモリーエラー
記事No10818
投稿日: 2012/05/22(Tue) 13:29
投稿者ymi
いつも御掲示板を参考にさせて頂いています。

現状でどうしても煮詰まっている件について記載させていただきます。
実施したいことは、バイナリ形式のビットマップイメージを
ビットマップに変換して、変換後のビットマップ画像データを
指定サイズでトリミングしたいのですが、メモリーエラーとなって
しまいます。 色々とネットにて検索いたしましたが自分の不徳により
こちらの掲示板に投稿させていただきました。

下記にサンプルを添付させていただきます。

画像の取り扱いは素人なので困っております。
見当違いの事があるかも解らないですが、よろしくお願いいたします。
開発環境:VB2010


Dim bmp1 As Bitmap = New Bitmap("T0.bmp")

' ビットマップをバイナリに変換
Dim mms1 As System.IO.MemoryStream = New System.IO.MemoryStream
bmp1.Save(mms1, System.Drawing.Imaging.ImageFormat.Bmp)
Dim dats() As Byte = mms1.GetBuffer()
mms1.Close()

Dim sPointX As Integer = 100
Dim sPointY As Integer = 100
Dim ePointX As Integer = 100
Dim ePointY As Integer = 100
Dim BitKit1 As Rectangle = New Rectangle(sPointX, sPointY, ePointX, ePointY)
Dim Kit1 As Bitmap = bmp1.Clone(BitKit1, bmp1.PixelFormat)

' ビットマップ表示
Me.PictureBox1.Image = Kit1     ' 表示は正常。

' バイナリをビットマップに変換
Dim mms2 As System.IO.MemoryStream = New System.IO.MemoryStream(dats)
Dim bmp2 As Bitmap = New Bitmap(mms2)
mms2.Close()

' ビットマップ表示
Me.PictureBox2.Image = bmp2     ' 表示は正常。

sPointX = 50
sPointY = 50
ePointX = 50
ePointY = 50
Dim BitKit2 As Rectangle = New Rectangle(sPointX, sPointY, ePointX, ePointY)
' 下記で「System.OutOfMemoryException はハンドルされませんでした。 
' メモリが不足しています。」と表示されます。
Dim Kit2 As Bitmap = bmp2.Clone(BitKit2, bmp2.PixelFormat)

' ビットマップ表示
Me.PictureBox3.Image = Kit2     '

[ツリー表示へ]
タイトルRe: ビットマップのメモリーエラー
記事No10820
投稿日: 2012/05/22(Tue) 14:09
投稿者Hongliang
System.Drawing周りでは、本来の意味とは無関係にOutOfMemoryExceptionが投げられることが間々あります。

で、今回のはbmp2の元となるmms2がCloseされているのが原因ですね。
MemoryStreamは基本的にCloseする必要はありません。

// 上半分のコードが何をしたいコードなのかよく分からない…。

[ツリー表示へ]
タイトルRe^2: ビットマップのメモリーエラー
記事No10822
投稿日: 2012/05/22(Tue) 14:19
投稿者ymi
Hongliang 様

早速の投稿をありがとうございます。
Hongliang 様のご指摘の通りCloseをコメントにした所
正常に動作しました。

ありがとうございます。

> MemoryStreamは基本的にCloseする必要はありません。
Closeの必要が無いのは知りませんでした。
ネット上の色々な情報を見渡した際は、「Close」が
有りましたので必ず必要と思っておりました。

> // 上半分のコードが何をしたいコードなのかよく分からない…。
そうです。今回の投稿には直接は関係ないとは思いましたが
元のビットマップは正常表示された事とバイナリ変換時を
示したかった次第です。ご指摘ありがとうございます。
今後の投稿では念頭に置きます。

以上です。 解決いたしました。ありがとうございます。

[ツリー表示へ]
タイトルRe^3: ビットマップのメモリーエラー
記事No10823
投稿日: 2012/05/22(Tue) 14:39
投稿者Hongliang
MemoryStreamが通常Closeする必要がないのは確かですが、同時にIDisposableを実装しているのも事実であり、Closeを呼び出すようにしておくのも悪くないことと思います。
ただ、今回の場合、MemoryStreamはBitmapに渡しています。Bitmapの中で、コンストラクタ以外にも渡したStreamが使用される可能性を考えれば、少なくともBitmapを使用中の間はCloseすべきではないでしょう。

[ツリー表示へ]
タイトルRe^4: ビットマップのメモリーエラー
記事No10824
投稿日: 2012/05/22(Tue) 15:35
投稿者ymi
Hongliang 様
再度のご指南。ありがとうございます。
本当に下記の件、参考になります。

ありがとうございました。

> MemoryStreamが通常Closeする必要がないのは確かですが、同時にIDisposableを実装しているのも事実であり、Closeを呼び出すようにしておくのも悪くないことと思います。
> ただ、今回の場合、MemoryStreamはBitmapに渡しています。Bitmapの中で、コンストラクタ以外にも渡したStreamが使用される可能性を考えれば、少なくともBitmapを使用中の間はCloseすべきではないでしょう。

[ツリー表示へ]