tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルpictureboxの高速描画
記事No5871
投稿日: 2007/07/19(Thu) 19:01
投稿者ぷち
いつもお世話になっております。

VB2005について質問いたします。
pictureboxにロードしたイメージを描画するのに、drawimageを使用しています。

g.DrawImage(img, rect2, rect, GraphicsUnit.Pixel)

しかし、イメージサイズが大きい(10000*10000)と、
描画するのにかなり時間がかかります。

高速に描画するよい方法はあるのでしょうか?

よろしくお願いします。

[ツリー表示へ]
タイトルRe: pictureboxの高速描画
記事No5873
投稿日: 2007/07/20(Fri) 09:39
投稿者よねKEN
> VB2005について質問いたします。
> pictureboxにロードしたイメージを描画するのに、drawimageを使用しています。
>
> g.DrawImage(img, rect2, rect, GraphicsUnit.Pixel)
>
> しかし、イメージサイズが大きい(10000*10000)と、
> 描画するのにかなり時間がかかります。

画像の種類は何ですか?
色数32bitのbitmapだとすると画像のイメージ分だけで約400MBはメモリを消費しますが、
ビデオカードの性能やメインメモリの容量は十分でしょうか?
(OS、VisualStudio、.NET Frameworkで消費する分も考慮するとメインメモリが1GBでも少ないかも)

> 高速に描画するよい方法はあるのでしょうか?

よっぽど大きな画面でも10000*10000は全部を一度には表示できないですよね?
画面に表示する分だけ描画してはいかがでしょうか?

#それでもいまどきの画面サイズ一杯に描画するとなると
#やはり遅いかもしれません

[ツリー表示へ]
タイトル pictureboxの高速描画
記事No5875
投稿日: 2007/07/20(Fri) 10:16
投稿者ぷち
ご回答ありがとうございます。
> 画像の種類は何ですか?
ビットの深さが8のjpgです。
> 色数32bitのbitmapだとすると画像のイメージ分だけで約400MBはメモリを消費しますが、
> ビデオカードの性能やメインメモリの容量は十分でしょうか?
> (OS、VisualStudio、.NET Frameworkで消費する分も考慮するとメインメモリが1GBでも少ないかも)
メモリは2Gですがやっぱ遅いです。
> よっぽど大きな画面でも10000*10000は全部を一度には表示できないですよね?
> 画面に表示する分だけ描画してはいかがでしょうか?
現在、全画像を一度imageにおいてから表示部分のみを表示しています。
しかし、全画面を表示する時もあるためその時は更に遅くなります。
> #それでもいまどきの画面サイズ一杯に描画するとなると
> #やはり遅いかもしれません
VB6ではscalemodeに「twip」がありました。これだと結構速く表示されていました。
しかし、2005はピクセルしか対応していないようです。
これに変わる設定はないのでしょうか?

また、CやVC2005で組むと表示関連は関連されるのでしょうか?

よろしくお願いします。

[ツリー表示へ]
タイトルRe: pictureboxの高速描画
記事No5876
投稿日: 2007/07/20(Fri) 11:25
投稿者魔界の仮面弁士
> VB6ではscalemodeに「twip」がありました。これだと結構速く表示されていました。
> しかし、2005はピクセルしか対応していないようです。

Dim bmp0, bmp1, bmp2 As Bitmap
Dim g0, g1, g2 As Graphics

bmp0 = New Bitmap(100, 100)
bmp1 = New Bitmap(100, 100)
bmp2 = New Bitmap(100, 100)
g0 = Graphics.FromImage(bmp0)
g1 = Graphics.FromImage(bmp1)
g2 = Graphics.FromImage(bmp2)

'単位系の変換
g1.ScaleTransform(0.2F, 0.2F)
g2.ScaleTransform(5.0F, 5.0F)

'単位系が変更されているので、下記はすべて異なるスケーリングになる
g0.DrawLine(Pens.Red, 1, 1, 20, 20)
g1.DrawLine(Pens.Red, 1, 1, 20, 20)
g2.DrawLine(Pens.Red, 1, 1, 20, 20)

g0.Dispose()
g1.Dispose()
g2.Dispose()

bmp0.Save("C:\a.png")
bmp1.Save("C:\b.png")
bmp2.Save("C:\c.png")

bmp0.Dispose()
bmp1.Dispose()
bmp2.Dispose()


> 全画面を表示する時もあるためその時は更に遅くなります。
全画面? UXGA のモニタでも1600×1200ドットですし、
10,000ドット×10,000ドットの画像を、一度に表示はできませんよね。

# 3840×2400クラス(QUXGA/Wide)でマルチモニタを組めば何とか表示できる?


> また、CやVC2005で組むと表示関連は関連されるのでしょうか?
言語ではなく、実装を見直さないと駄目かと思います。
よねKENさんが書かれているように、「画面に表示する分だけ描画」するとか、
あるいは画像を一度に読み込まず、幾つかの小さな画像に分割して処理するとか。

[ツリー表示へ]
タイトルRe^2: pictureboxの高速描画
記事No5877
投稿日: 2007/07/20(Fri) 11:48
投稿者Hongliang
GDI+(System.Drawing のベースとなるライブラリ)では、
DrawImage する際に渡す Image オブジェクトが大きいと、
描画先の範囲が小さかろうが結構なコストがかかります。
ですので「画面に表示する分だけ描画」と言う戦略はこの場合あまり意味がないです。
// というか ぷち さんは元々そうなさってますよね。

事前に元画像をある程度のサイズに分割しておく必要があるでしょう。
それから、どうせ自前で描画するなら PictureBox は使わずに直接 Control を派生した自前のクラスの方がいいかも。

// WPF なら、10000x10000 の BitmapSource 使った ImageBrush を Background にしても
// 気にならないなぁ。

[ツリー表示へ]
タイトルRe^3: pictureboxの高速描画
記事No5879
投稿日: 2007/07/20(Fri) 11:53
投稿者ぷち
ご回答ありがとうございます。
> GDI+(System.Drawing のベースとなるライブラリ)では、
> DrawImage する際に渡す Image オブジェクトが大きいと、
> 描画先の範囲が小さかろうが結構なコストがかかります。
なるほど、参考になります。

> 事前に元画像をある程度のサイズに分割しておく必要があるでしょう。
> それから、どうせ自前で描画するなら PictureBox は使わずに直接 Control を派生した自前のクラスの方がいいかも。
> // WPF なら、10000x10000 の BitmapSource 使った ImageBrush を Background にしても
> // 気にならないなぁ。
WPFとは何でしょうか?教えてください。
よろしくお願いします。

[ツリー表示へ]
タイトルRe^4: pictureboxの高速描画
記事No5882
投稿日: 2007/07/20(Fri) 12:13
投稿者魔界の仮面弁士
> WPFとは何でしょうか?教えてください。

大雑把にいうと、XAML(ザムル)等で使われる、.NET 3.0 のグラフィック機構です。
Vista に標準で搭載されています。(XP では追加インストールが必要です)

「WPF」あるいはフルネームの「Windows Presentation Foundation」、
またはコードネーム「Avalon」などで検索してみると、情報が見つかるでしょう。

[ツリー表示へ]
タイトルRe^5: pictureboxの高速描画
記事No5884
投稿日: 2007/07/20(Fri) 12:20
投稿者ぷち
ご回答ありがとうございます。
> 大雑把にいうと、XAML(ザムル)等で使われる、.NET 3.0 のグラフィック機構です。
> Vista に標準で搭載されています。(XP では追加インストールが必要です)
>
> 「WPF」あるいはフルネームの「Windows Presentation Foundation」、
> またはコードネーム「Avalon」などで検索してみると、情報が見つかるでしょう。
Vista搭載ということは、Windows98,2000ではWPFを使用して作成したソフトは動作しない
のでしょうか?

よろしくお願いします。

[ツリー表示へ]
タイトルRe^6: pictureboxの高速描画
記事No5885
投稿日: 2007/07/20(Fri) 13:41
投稿者魔界の仮面弁士
>> 大雑把にいうと、XAML(ザムル)等で使われる、.NET 3.0 のグラフィック機構です。
>> Vista に標準で搭載されています。(XP では追加インストールが必要です)
> Vista搭載ということは、Windows98,2000ではWPFを使用して作成したソフトは動作しない
> のでしょうか?

でしょうね。それらの OS では「.NET Framework 3.0」がサポートされていませんから。
http://www.microsoft.com/japan/msdn/netframework/downloads/netfx3.aspx

[ツリー表示へ]
タイトルRe^7: pictureboxの高速描画
記事No5886
投稿日: 2007/07/20(Fri) 13:59
投稿者ぷち
いろいろありがとうございました。
とても参考になりました。
今後ともよろしくお願いします。

[ツリー表示へ]
タイトル pictureboxの高速描画
記事No5878
投稿日: 2007/07/20(Fri) 11:50
投稿者ぷち
ご回答ありがとうございます。
ソフト参考にさせていただきます。

> 全画面? UXGA のモニタでも1600×1200ドットですし、
> 10,000ドット×10,000ドットの画像を、一度に表示はできませんよね。
全画面の画像を縮小してpictureboxに表示しています。
表現が不適切で申し訳ありませんでした。

> 言語ではなく、実装を見直さないと駄目かと思います。
> よねKENさんが書かれているように、「画面に表示する分だけ描画」するとか、
> あるいは画像を一度に読み込まず、幾つかの小さな画像に分割して処理するとか。
実装方法は考えたいと思います。
やはり大きな画像の描画は処理的に重いのでしょうか?
よろしくお願いします。

[ツリー表示へ]
タイトルRe: pictureboxの高速描画
記事No5881
投稿日: 2007/07/20(Fri) 12:02
投稿者魔界の仮面弁士
> > 全画面? UXGA のモニタでも1600×1200ドットですし、
> > 10,000ドット×10,000ドットの画像を、一度に表示はできませんよね。
> 全画面の画像を縮小してpictureboxに表示しています。
縮小している時点で、もはや10,000ドット×10,000ドットではないですよね。

> やはり大きな画像の描画は処理的に重いのでしょうか?
巨大データを一度にロードするとなると、やはり負荷は高くなるでしょう。

画像の一部だけをロードできる機能を持っている場合や、
複数解像度を持った画像データ(PhotoCD等)であればともかく。

なので、大きな画像を 1 つだけ保持する代わりに、複数の小さな画像単位に縮小して、
部分部分で処理を行うことを提案した次第です。(google map のような感じ?)

[ツリー表示へ]
タイトルRe^2: pictureboxの高速描画
記事No5883
投稿日: 2007/07/20(Fri) 12:18
投稿者ぷち
ご回答ありがとうございます。
> 縮小している時点で、もはや10,000ドット×10,000ドットではないですよね。
はいその通りです。
> 巨大データを一度にロードするとなると、やはり負荷は高くなるでしょう。
やはりそうですか。
> 画像の一部だけをロードできる機能を持っている場合や、
> 複数解像度を持った画像データ(PhotoCD等)であればともかく。
>
> なので、大きな画像を 1 つだけ保持する代わりに、複数の小さな画像単位に縮小して、
> 部分部分で処理を行うことを提案した次第です。(google map のような感じ?)
ありがとうございます。
検討したいと思います。

[ツリー表示へ]