tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル画像のトリミングと保存について
記事No5848
投稿日: 2007/07/17(Tue) 16:23
投稿者ひでと
お世話になります。
PictureBox1とPictureBox2を使い、PictureBox1には画像をAutoSizeにして取り込み
PictureBox2にその一部を表示しようとしています。表示は出来たのですが、それを保存
するためには、PictureBox2のImageプロパティに画像を反映しなければならないようです。
GraphicsクラスのDrawImageを使用していますが、Imageプロパティの設定ができません。
どのようにすればよいのでしょうか。よろしくお願いします。

    Private Sub PicD()
        Dim newGraphics As Graphics
        Dim newImage As Image
        Dim l As Single
        Dim t As Single
        Dim rf As Rectangle
        Try
            newImage = PictureBox1.Image
            newGraphics = PictureBox2.CreateGraphics

            l = PictureBox2.Left - PictureBox1.Left
            t = PictureBox2.Top - PictureBox1.Top
            rf.X = l
            rf.Y = t
            rf.Width = PictureBox2.Width
            rf.Height = PictureBox2.Height

            newGraphics.DrawImage(newImage, 0, 0, rf, GraphicsUnit.Pixel)
        Catch ex As Exception
        End Try
    End Sub

[ツリー表示へ]
タイトルRe: 画像のトリミングと保存について
記事No5851
投稿日: 2007/07/17(Tue) 17:30
投稿者魔界の仮面弁士
そういう時は、PictureBox2 上に描画するのではなく、
別途、Bitmap クラスを生成して、そこの上に描画しては如何でしょう。

つまり、PictureBox2.CreateGraphics から Graphics を得るのではなく、
 Dim bmp As New Bitmap(〜)
 Dim g As Graphics = Graphics.FromImage(bmp)
のようにするということです。

そうすれば、bmp.Save でファイルに保存することも、
その bmp を PictureBox2 に表示させることもできるかと。

[ツリー表示へ]
タイトルRe^2: 画像のトリミングと保存について
記事No5858
投稿日: 2007/07/18(Wed) 10:00
投稿者ひでと
ありがとうございます。
> そういう時は、PictureBox2 上に描画するのではなく、
> 別途、Bitmap クラスを生成して、そこの上に描画しては如何でしょう。
>
> つまり、PictureBox2.CreateGraphics から Graphics を得るのではなく、
>  Dim bmp As New Bitmap(〜)
>  Dim g As Graphics = Graphics.FromImage(bmp)
> のようにするということです。
>

すみません 以下の部分が解らないのですが、もう少し教えてください。
> そうすれば、bmp.Save でファイルに保存することも、
> その bmp を PictureBox2 に表示させることもできるかと。

一応 こんなコードを試してみたのですが
    Private Sub PicD()
        Dim newGraphics As Graphics
        Dim bmp As Bitmap
        Dim l As Single
        Dim t As Single
        Dim rf As Rectangle
        Try
            bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height)
            bmp = PictureBox1.Image
            newGraphics = Graphics.FromImage(bmp)

            l = PictureBox2.Left - PictureBox1.Left
            t = PictureBox2.Top - PictureBox1.Top
            rf.X = l
            rf.Y = t
            rf.Width = PictureBox2.Width
            rf.Height = PictureBox2.Height

            newGraphics.DrawImage(bmp, 0, 0, rf, GraphicsUnit.Pixel)
            newGraphics.ExcludeClip(rf)
            PictureBox2.Image = bmp
        Catch ex As Exception
        End Try
    End Sub
このコードでは bmpは元のPictureBox1.Image のままになってしまいます。
Graphicsを元にPictureBox2.Image を書き換える処理が必要かと思ったのですが
Graphicsの説明にはそれにあたるところが見つけられませんでした。
よろしくお願いします。

[ツリー表示へ]
タイトルRe^3: 画像のトリミングと保存について
記事No5859
投稿日: 2007/07/18(Wed) 12:11
投稿者魔界の仮面弁士
> bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height)
ここでビットマップを生成して、それを bmp 変数に格納しているのに

> bmp = PictureBox1.Image
その直後に、(その bmp を破棄して)別のイメージを bmp に入れては駄目ですよ。
ここを削除するか、または、別の変数に受け取るようにしてください。

> newGraphics = Graphics.FromImage(bmp)
(中略)
> newGraphics.DrawImage(bmp, 0, 0, rf, GraphicsUnit.Pixel)
この場合の newGraphics は、「bmp に描画するためのクラス」なのですから、
これでは、「自分の内容を、自分自身に重ね描き」していることになってしまいます。

newGraphics を、New Bitmap から生成した Graphics として、
DrawImage の第一引数を、PictureBox1 上の Image にしてみてください。

> PictureBox2.Image = bmp
Image を交換する場合には、その前に設定されていた画像を、Dispose で破棄しましょう。

[ツリー表示へ]
タイトルRe^4: 画像のトリミングと保存について
記事No5861
投稿日: 2007/07/18(Wed) 14:37
投稿者ひでと
ありがとうございました。以下のように直してうまくいきました。

    Private Sub PicD()
        Dim newGraphics As Graphics
        Dim bmp As Bitmap
        Dim l As Single
        Dim t As Single
        Dim rf As Rectangle
        Try
            bmp = New Bitmap(PictureBox2.Width, PictureBox2.Height)
            newGraphics = Graphics.FromImage(bmp)

            l = PictureBox2.Left - PictureBox1.Left
            t = PictureBox2.Top - PictureBox1.Top
            rf.X = l
            rf.Y = t
            rf.Width = PictureBox2.Width
            rf.Height = PictureBox2.Height

            newGraphics.DrawImage(PictureBox1.Image, 0, 0, rf, GraphicsUnit.Pixel)
            newGraphics.ExcludeClip(rf)
            PictureBox2.Image = bmp
            newGraphics.Dispose()
        Catch ex As Exception
        End Try
    End Sub

[ツリー表示へ]