画像の表示方法

タグの編集
投稿者 ころんぱ  (社会人) 投稿日時 2011/2/1 03:42:03
 こんばんわ
 画像の表示方法について教えてください
 VB2010をいじり始めて結構経つのですが、画像の表示がいまひとつうまくいきません。
サイトによりやりかたが違っていて、それで混乱してるとこもろある感じなのですが・・
 ここのサイトでは、ちょうどゲーム講座というものが連載され始めていましたので、ちょうどいいなと思い、改めて試してみましたが、この短いロジックさえもうまくいきませんでした。

 最近は疲労感でいっぱいなので;ここで素直に質問に書いてみたいと思います (最近は質問を連発ぎみになってしまって申し訳ないと思いますが・・)

 このサイトの講座の↓
 第1回 キャラクターの出現と移動
 2.キャラクターの表示
 2-2.描画プログラム
のサンプルを実行したのですが、表示されたキャラクターは非常に拡大された状態で、フォームには数ピクセルしか見えない状態になりました(1ピクセルが、フォームの1/5くらいに広がっています)
 いろいろ検討すべきとありますし、それが肝だと思ってフォームのプロパティなどなどいろいろ試してたのですが全く変化が無く、私には解けませんでした;
 そこで、等倍で表示できるよう方法を教えて頂けないでしょうか??
 (ちなみに左右に揺れる動作をするよう改造してみたらちゃんと動いたので、(黒い壁がゆれているのでわかる)移動部分はうまくいってると思います)

 それから、窓にあわせて拡大縮小は出来るのでしょうか?
 どんなPCでも対応出来るようにと考えて、320×240でやりたいのですが、拡大しないと小さくてみずらく、それに(サイズ可変出来るように)後から作り変えになるよりは・・、と思って画像を拡大出来るよう、VB6の説明や海外サイトなどを参考にして組んでいたのですが、非常にわかりずらく大変な上、シンプルにしたいのに座標の演算にもすべてかかわって無意味に複雑になってしまうので、出来れば最初から窓にあわせて拡大出来るようにしたいと思います。これも出来ればアドバイスお願いします;

 他、画像はpictureboxに描画は出来ないでしょうか?
 (全くやりかたや考え方が違うのであれば、しかたないのですが)
 ここでのサンプルはたぶんフォームに描画がされていると思います。それを決めているのは
下記の”Me.BackgroundImage = bmp”のところのように思いました(たぶん)

 ※サンプルソースのコピペです
Private Sub Init()    '▼描画用のGraphicsクラスの確保(技術的な処理)
    If mainGraphics Is Nothing Then
        '初回のみ生成
        Dim bmp As New Bitmap(Me.ClientRectangle.Width, Me.ClientRectangle.Height)
        Me.BackgroundImage = bmp
        mainGraphics = Graphics.FromImage(bmp)
    End If

 ただ代入してるように見えますが・・・初心者には難解でしたら今はあきらめます
 これも、アドバイス頂けたらお願いします<(__)>
投稿者 shu  (社会人) 投稿日時 2011/2/1 08:02:53
直近の
『Form画像の読み込み』
『シューティングゲームについて』
『弾幕的なものを作りたいです!』
の内容とかも参考にしてみて下さい。
投稿者 るきお  (社会人) 投稿日時 2011/2/1 13:18:39
こんにちは。

>VB2010をいじり始めて結構経つのですが、画像の表示がいまひとつうまくいきません。
まず、どうやっているのかプログラムを載せてください。
サイトに掲載しているサンプルをそのまま利用している場合でも載せてください。

それから、「うまくいきません。」と書かれていますが、具体的には
>表示されたキャラクターは非常に拡大された状態で、フォームには数ピクセルしか見えない状態になりました(1ピクセルが、フォームの1/5くらいに広がっています)
この状態のことを指しているということですよね。

つまり、ころんぱさんが、何かのソフトで画像を開いた時と、VBのプログラムで画像を表示させた時とで大きさが違うので、同じ大きさで表示させたい
ということと受け取りました。

冒頭に書いたようにプログラムは載せていただきたいのですが、
これと併せてその画像のdpiがいくつになっているか確認できますか?
bmpやjpegであれば、プロパティ画面で水平方向の解像度、垂直方向の解像度が確認でき、これがdpiの値になります。
標準的なdpiは96です。この値がことなると大きく表示されたり小さく表示されたりします。

拡大・縮小の件は可能ですが、まずはひとつずつ解決していきましょう。
投稿者 (削除されました)  () 投稿日時 2011/2/2 22:26:59
(削除されました)
投稿者 (削除されました)  () 投稿日時 2011/2/2 22:33:13
(削除されました)
投稿者 ころんぱ  (社会人) 投稿日時 2011/2/2 23:24:44
■shu様
ついさっき、『弾幕的なものを作りたいです!』の中の南場様のサンプルを見てみました。画像を描画するまでの宣言の過程が見やすくのっていますね。少しずつでも調べてみようと思います。完結しているソフトでしたので、手軽に動いてるところが見れるのも助かります
他の分もひとつひとつおっかけて調べてみようと思います

■るきお様
bmp画像のdpiの件は参考になりました。bmpファイルを直接右クリック→プロパティ→「概要」で確認出来ますね。2dpiでした。96dpiにして、改めて実行してみるとうまくいきました;;ありがとうございます

今回の件は、
>何かのソフトで画像を開いた時と、VBのプログラムで画像を表示させた時とで大きさが違うので、同じ大きさで表示させたい
で間違いありません

表示させていたのは、サンプルと同一の画像をbmp化したものでしたが、フォームが全てマゼンダで埋まり、bmpの左上にドットを入れても(かなり拡大されているため)霧のようなものが見えるだけ、という感じでした

dpiは、日頃使用しているAZ-PAINTERでbmp変換すると2dpiになってしまうようです。ちょっとツールは探してみます。(ちなみに 96dpiで等倍になるようですが、実際はdpiを元に常に拡大縮小が活きている、という感じみたいですね。あまり意識する必要は無いかもしれませんが)

とりあえず、今回のロジックを元にいろいろ試してみたいと思います。講座も是非参考にしていきます


●ソースです↓
Public Class Form1

    Private mainGraphics As Graphics
    Private PlayerImage As Bitmap

    'Private Property Center As ImageLayout

    Public X As Integer 'X座標 追記
    Public XZ As Integer '移動量 追記


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Init()
        Timer1.Enabled = True
        X = 0 'X座標 追記
        XZ = 0 '移動量 追記
    End Sub
    Private Sub Init()

        '▼描画用のGraphicsクラスの確保(技術的な処理)
        If mainGraphics Is Nothing Then
            '初回のみ生成
            Dim bmp As New Bitmap(Me.ClientRectangle.Width, Me.ClientRectangle.Height)
            Me.BackgroundImage = bmp
            mainGraphics = Graphics.FromImage(bmp)
        End If

        'exeと同じフォルダーにあるPlayer1.bmpを読み込む。
        'これができるのは、ファイルのプロパティで出力ディレクトリにコピーする設定になっているから。
        'PlayerImage = Image.FromFile(Application.StartupPath & "\CHARA1.bmp") 元

        PlayerImage = Image.FromFile("D:\110201 VB GAZOU\aaa.bmp") '画像読込書換
        ' ダブルバッファリング 追記
        Me.DoubleBuffered = True
    End Sub
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        '描画されているものを消して全面を黒くする。
        mainGraphics.Clear(Color.Black)

        '座標演算追記 XZ=移動量
        X = X + XZ

        'X座標の位置100を基準に増減速追記 XZ=移動量
        If X > 100 Then
            XZ = XZ - 1
        Else
            XZ = XZ + 1
        End If

        mainGraphics.DrawImage(PlayerImage, X, X)

        'フォームを再描画
        Me.Invalidate()

    End Sub
End Class


※ただ、実はもう、たまらずマップチップを並べてスクロールさせるところまで一気に組んでみました。描画とダブルバッファリングというのを知ったので・・。
長いことやりたかったマップチップを使った2Dのマップ表示&スクロールがやっと出来ました(泣)
(描画までの部分はまだほとんど理解していませんが、描画が出来ればかなり楽しくVBを続けられそうです)