tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルグラフィックの大きさについて
記事No5044
投稿日: 2007/03/04(Sun) 22:18
投稿者Tomi
こんにちは、現在VB2005、OS-XPproにて、画像処理をしています。

ピクチャーボックスに画像を表示する際、

Dim image As Image = Bitmap.FromFile(ObjFilePath)
Dim img As New Bitmap(image.Width, image.Height)
Dim g As Graphics = Graphics.FromImage(img)
g.DrawImage(image, 0, 0)
PictureBox.Image = img

とコーティングした場合と

PictureBox.Image = image.FromFile(ObjFilePath)

とコーティングした場合、PictureBox上の描画される大きさが異なって表示されます。

PictureBoxのSizeModeは、Nomalに設定しています。
テストした画像は、W2200、H1700相当の画像です。

何をしたいかというと、画像をDrawing2D.Matrixを使用し、
拡大縮小、および回転させた状態のイメージを、
別のイメージに貼り付け、RectAngle構造体にて部分的に切り抜くことを
考えていますが、どうにもこうにも、イメージの大きさが揃わないので、
困っています。

そこで、上記のように、直接描画と、Graphics を用いた単純な
PictureBoxへの描画を試したところ、大きさが違っていたので、もしかして
これが原因かなと思っているのですが、自分なりに探してみたのですが
自分の力不足で、解決できません。

ここで、皆様のお力をお借りしたく、書き込みさせていただきます。
どうぞよろしくお願いします。

[ツリー表示へ]
タイトルRe: グラフィックの大きさについて
記事No5046
投稿日: 2007/03/04(Sun) 23:19
投稿者Hongliang
解像度の問題かな。
両方の画像の Image.HorizontalResolution/VerticalResolution プロパティを調べてみて、
異なっていれば Bitmap.SetResolution メソッドで元絵に合わせてみてください。

[ツリー表示へ]
タイトルRe: グラフィックの大きさについて
記事No5048
投稿日: 2007/03/04(Sun) 23:57
投稿者花ちゃん
そのコードで 200 × 200 程度のビットマップファイルで試して見ましたが同じ
サイズで表示されます。

どのような画像(拡張子は)を使っておられるのか? 小さいサイズなら問題がないのか?
まったくの新規のプロジェクトで試しても同じなのか?
他の画像ファイルならどうなのか? 等々、もう少し問題を絞り込んだ方がいいのでは。

確実に事象を再現できるコードを投稿して頂くと試してみる事も出来るのですが。

[ツリー表示へ]
タイトルRe^2: グラフィックの大きさについて
記事No5049
投稿日: 2007/03/05(Mon) 03:41
投稿者Tomi
花ちゃん様、Hongliang様

早速の回答ありがとうございます。


花ちゃん様、本当にありがとうございます。

> そのコードで 200 × 200 程度のビットマップファイルで試して見ましたが同じ
> サイズで表示されます。

> どのような画像(拡張子は)を使っておられるのか?
W2200,H1700相当のJpeg画像ファイルです。

> 小さいサイズなら問題がないのか?
不思議なことに確かに、小さな画像では問題ないようです。

> まったくの新規のプロジェクトで試しても同じなのか?
> 他の画像ファイルならどうなのか? 等々、もう少し問題を絞り込んだ方がいいのでは。

数種類の画像データで試してみましたが、結果は同じでした。


> 確実に事象を再現できるコードを投稿して頂くと試してみる事も出来るのですが。

新規プロジェクトにて、下記コードを作成しましたが、結果は同じでした。

Public Class Form1

    Dim objFile As String = "c:\obj.jpg"

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

        If PictureBox1.Image IsNot Nothing Then
            PictureBox1.Image = Nothing
        End If

        PictureBox1.Image = Image.FromFile(objFile)

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        Dim image As Image = image.FromFile(objFile)
        Dim img As New Bitmap(image.Width, image.Height)
        Dim g As Graphics = Graphics.FromImage(img)
        g.DrawImage(image, 0, 0)

        If PictureBox1.Image IsNot Nothing Then
            PictureBox1.Image = Nothing
        End If

        PictureBox1.Image = img
        g.Dispose()

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        PictureBox1.SizeMode = PictureBoxSizeMode.Normal
        PictureBox1.Width = 738
        PictureBox1.Height = 468
    End Sub
End Class


Hongliang様、
ご指導をいただきありがとうございます。
自分の力不足ゆえ、調べるところまでまだ至っておりません。申し訳ございません。

いま少し、自力でがんばってみます。


花ちゃん様、Hongliang様、
再度、ご指摘、ご指導があれば、よろしくお願いします。
もし、自分なりにわかれば、必ず報告させていただきます。

[ツリー表示へ]
タイトルRe^3: グラフィックの大きさについて
記事No5050
投稿日: 2007/03/05(Mon) 07:34
投稿者花ちゃん
>         Dim image As Image = image.FromFile(objFile)
>         Dim img As New Bitmap(image.Width, image.Height)
>         Dim g As Graphics = Graphics.FromImage(img)
>         g.DrawImage(image, 0, 0)

        g.DrawImage(image, 0, 0, image.Width, image.Height)

にすると同じ大きさで表示されます。
又は、下記でもOK

    Private Sub Button2_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) Handles Button2.Click
        PictureBox1.SizeMode = PictureBoxSizeMode.Normal
        PictureBox1.Width = 738
        PictureBox1.Height = 468

        Dim image As Image = image.FromFile(objFile)
        Dim img As New Bitmap(image.Width, image.Height)
        Dim g As Graphics = Graphics.FromImage(img)
        g.DrawImage(image, 0, 0)

        If PictureBox1.Image IsNot Nothing Then
            PictureBox1.Image = Nothing
        End If

        PictureBox1.Image = img
        g.Dispose()
    End Sub

[ツリー表示へ]
タイトルRe^4: 解決しました
記事No5075
投稿日: 2007/03/06(Tue) 11:54
投稿者tomi
花ちゃん様

ご指導ありがとうございます。
コードをご指摘のようにしましたら、解決しました。

g.DrawImage(image, 0, 0, image.Width, image.Height)

しかし、私がやりたかったRectAngle構造体などで切り抜き作業をする場合、

Dim image As Image = image.FromFile(objFile)
Dim img As New Bitmap(image.Width, image.Height)
Dim g As Graphics = Graphics.FromImage(img)
g.DrawImage(, 0, 0, NewRectangle(100.100.200.200), GraphicsUnit.Pixel))

とすると、image のW,Hを指定できないので、
結果として画像の大きさ(クリップ領域)がずれてしまうようです。

そこで、ご指導いただいたコードを基に、一旦イメージをNewで確定して、
再度下記のように2度繰り返せば、解決できることが分かりました。

Dim image As Image = image.FromFile(objFile)
Dim img1 as New Bitmap(image.Width, image.Height)    ’イメージの読み込み
Dim g1 as graphics=Graphics.FormFile(img1)
g1.DrawImage(image, 0, 0, image.Width, image.Height)   'クリップするイメージ確定

Dim Img2 as New Bitmap(image.Width, image.Height)
Dim g2 as graphics=Graphics.FormFile(Img2)
g2.DrawImage(img1, 0, 0, NewRectangle(100.100.200.200), GraphicsUnit.Pixel))

今回はご指導いただき本当にありがとうございました。
改めて御礼申し上げます。



  


[ツリー表示へ]