PictureBoxのPaintイベントでStretchBltで描画したい
- 題名: PictureBoxのPaintイベントでStretchBltで描画したい
- 著者: ひで46
- 日時: 2009/01/22 20:35:19
- ID: 23844
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: PictureBoxのPaintイベントでStretchBltで描画したい
- 著者: 管理人
- URL: http://dobon.net/
- 日時: 2009/01/23 2:54:41
- ID: 23845
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: PictureBoxのPaintイベントでStretchBltで描画したい
- 著者: ひで46
- 日時: 2009/01/23 9:02:03
- ID: 23846
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: PictureBoxのPaintイベントでStretchBltで描画したい
- 著者: ひで46
- 日時: 2009/01/23 11:55:46
- ID: 23848
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: PictureBoxのPaintイベントでStretchBltで描画したい
- 著者: Hongliang
- 日時: 2009/01/23 12:34:37
- ID: 23849
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[5]: PictureBoxのPaintイベントでStretchBltで描画したい
- 著者: ひで46
- 日時: 2009/01/23 13:19:43
- ID: 23850
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[6]: PictureBoxのPaintイベントでStretchBltで描画したい
- 著者: Hongliang
- 日時: 2009/01/23 13:48:06
- ID: 23851
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[7]: PictureBoxのPaintイベントでStretchBltで描画したい
- 著者: ひで46
- 日時: 2009/01/23 18:11:06
- ID: 23853
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[8]: PictureBoxのPaintイベントでStretchBltで描画したい
- 著者: H.K.R.
- 日時: 2009/01/25 0:07:18
- ID: 23854
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[9]: PictureBoxのPaintイベントでStretchBltで描画したい
- 著者: ひで46
- 日時: 2009/01/26 14:28:53
- ID: 23860
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: PictureBoxのPaintイベントでStretchBltで描画したい
- 著者: 魔界の仮面弁士
- 日時: 2009/01/26 17:59:43
- ID: 23864
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: PictureBoxのPaintイベントでStretchBltで描画したい
- 著者: ひで46
- 日時: 2009/01/26 21:04:34
- ID: 23868
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: PictureBoxのPaintイベントでStretchBltで描画したい
- 著者: 魔界の仮面弁士
- 日時: 2009/01/27 12:08:34
- ID: 23870
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: PictureBoxのPaintイベントでStretchBltで描画したい
- 著者: ひで46
- 日時: 2009/01/27 16:05:32
- ID: 23872
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
画像ファイルのビューアを作っています。 フォームにPictureBoxとVScrollBar、HScrollBarを置いています。 ビットマップm_MyBmpに画像ファイルを別途ロードして PictureBoxのPaintイベントにてPictureBoxの描画領域に相当する 矩形領域をビットマップから切り出して描画しています(DrawImageメソッド使用)。 Paintイベントでのコードは下記の通りで問題なく動作します。 Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint Dim rectD As New Rectangle(0, 0, PictureBox1.Width, PictureBox1.Height) Dim w As Integer Dim h As Integer Dim iHS As Integer Dim iVS As Integer If m_MyBmp Is Nothing Then Exit Sub End If w = PictureBox1.ClientSize.Width / m_ZoomF 'm_ZoomF:ズーム倍率変数(1,2,4,8,16の何れか) h = PictureBox1.ClientSize.Height / m_ZoomF iHS = HScrollBar1.Value iVS = VScrollBar1.Value With e.Graphics .PixelOffsetMode = Drawing2D.PixelOffsetMode.Half .InterpolationMode = Drawing2D.InterpolationMode.NearestNeighbor .DrawImage(m_MyBmp, rectD, iHS, iVS, w, h, GraphicsUnit.Pixel) End With End Sub ところが巨大な画像ファイル(例えば16Kx4K)を開いたとき、パフォーマンスが 急激に落ちます。 Windowsアクセサリのペイントで同じ画像を開いてもスクロールなどは高速 なので、PCの問題でなく、プログラムの作り方の問題のはずです。 ネットで調べてDrawImageは巨大画像ファイルで遅くなると知り、この部分を StretchBltを用いた処理にて置き換えたいと考えました。色々調べてやって いますが、うまくいきません。 Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint Dim rectD As New Rectangle(0, 0, PictureBox1.Width, PictureBox1.Height) Dim w As Integer Dim h As Integer Dim gS As Graphics Dim HDC_Src As IntPtr Dim HDC_Dst As IntPtr Dim hBmpSrcBackup As IntPtr If m_MyBmp Is Nothing Then Exit Sub End If HDC_Dst = CreateCompatibleDC(e.Graphics.GetHdc()) gS = Graphics.FromImage(m_MyBmp) HDC_Src = gS.GetHdc() hBmpSrcBackup = SelectObject(HDC_Src, m_MyBmp.GetHbitmap()) StretchBlt(HDC_Dst, 0, 0, w, h, HDC_Src, HScrollBar1.Value, VScrollBar1.Value, SRCCOPY) SelectObject(hBmpSrcBackup, m_MyBmp.GetHbitmap()) gS.ReleaseHdc(HDC_Src) e.Graphics.ReleaseHdc(HDC_Dst) End Sub このように書きましたが、何も描画されません。 アドバイスを頂きたく、よろしくお願いします。