画像転送(ワールド変換行列)について

このQ&Aのポイント
  • 画像をスムーズに左から右へ移動させる方法
  • 画像の移動時に残像が残らないよう対策する方法
  • 画像の移動でちらつきを抑える方法
回答を見る
  • ベストアンサー

画像転送(ワールド変換行列)について

Dim g As Graphics = PictureBox1.CreateGraphics() Dim img As Image = Image.FromFile("○○.jpg") For i = 1 To 10 g.TranslateTransform(+10, 0) g.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height)) Next i 上記のような感じで画像を左から右へとスムーズに 動かしたいのですが、移動毎の残像が残ってしまいます。 毎回Refreshするとちらつきが出てしまいますし……。 どうしたら残像が残らず画像を移動出来るでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

単純にFormのバックカラーでいのでしたらBlackイメージの作成を g1.FillRectangle( new SolidBrush( Me.BackColor ), _   new Rectangle( 0, 0, img.Width, img.Height ) ) といった具合にして見ましょう

yamayosi_5
質問者

お礼

何度も有難う御座いました! 無事にイメージ通りのものが完成しました。 本当に感謝いたします。

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

移動した分がそのまま残るのであれば 消去用のイメージの作成がうまくいってないのではと考えられます ピクチャーボックスの BackColorがColor.Transparentなのでしょうか 透過色に設定されていると上書きしても残像が残ってしまいます ピクチャーボックスのコンテナから背景を取得して上書きといった手順が必要になりそうですよ

yamayosi_5
質問者

お礼

何度も有難う御座いました! 無事にイメージ通りのものが完成しました。 本当に感謝いたします。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

当方が検証したのは VB.NET2005ですが このあたりは同じだったと思います 単にフォームにピクチャーボックスを貼り付けて 適当な画像を使って お示しのコード + 改良部分で検証しました どの程度残像が残るのでしょう 移動した分がそのまま残るのでしょうか?

yamayosi_5
質問者

補足

はい、仰る通り移動した分がそのまま残ります。 Refreshをするとちらつきは出ますが、残像は消えます。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

以前描画した領域を消去してから新しいイメージを描画しましょう dim blank as Image = new Bitmap(img.Width, img.Height) Dim g1 as Graphics = Graphics.FromImage( blank ) g1.FillRectangle( new SolidBrush( PictureBox1.BackColor ), _   new Rectangle( 0, 0, img.Width, img.Height ) ) g1.Dispose() といった準備をしておきます 描画する際に For i = 1 To 10   // 描画領域を消去   g.DrawImage(blank, New Rectangle(0, 0, img.Width, img.Height))   g.TranslateTransform(+10, 0)   g.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height))   // 画面の更新待ち   Threading.Thread.Sleep( 200 ); Next i といった具合にします これでもちらつきがきになるのであれば『ダブルバッファ』など散らすつきを抑える技法を使いましょう

yamayosi_5
質問者

お礼

素早く丁寧な回答有難う御座います。 ただ、これをそのまま使用してみたところ やはり残像の方が残ってしまいます。 何が原因なんでしょうね……。 補足ですが、環境はVisual Basic 2008です。

関連するQ&A

  • 【VB2005】画像の切り出し

    こんばんは。 VB2005で、画像ファイルの一部を切り出し、Image型の変数に格納する方法が分かりません。 (DrawImageメソッドで切り出した画像を描画する事はできました) 【例】 Dim i As Integer Dim sourceImg As Image = Image.FromFile("test.bmp") Dim img(9) As Image For i = 0 To img.Length - 1   img(i) = [sourceImgの一部] Next どなたか、ご教授頂けないでしょうか?

  • 式はメソッドではありませんと表示されます。

    特定の文字を検出すうrと、それに応じた画像が表示されるように プログラムしたのですが、タイトルのようにエラーが出ます。 宣言をしないと「宣言が必要」で、宣言をするとタイトルのように。 正直、全くの初心者なのでタイトルが何を言っているのか全く分かりません。 ネットでも調べましたが、詳しくは分からず……。 ここならばと思い、投稿しました。 問題部分は下記の「DrawFadedImage」部分です。 エラー修正オプションをしても同じように出ます。 ElseIf InStr(Mainlabel.Text, "テスト") Then Mainlabel.Text = Replace(Mainlabel.Text, "テスト", "") Savepic = 51 'PictureBox1のGraphicsオブジェクトを取得 Dim g As Graphics = PicC.CreateGraphics() '画像を読み込む Dim img As Image = Image.FromFile("Data\Pic\132.ELS") 'フェードイン Dim i As Integer For i = 1 To 10 Console.WriteLine((i * 0.1F)) DrawFadedImage(g, img, i * 0.1F) System.Threading.Thread.Sleep(1) PicC.Image = img Next i

  • (VB.net)画像の一部を切り取って,拡大・縮小したい

    内容を見ていただき,ありがとうございます。 タイトルのままですが,PictureBoxに画像を出して,その一部を切り取ったうえで拡大・縮小させるプログラムを作成しています。 今のところ,画像の一部を切り出すことはできたのですが,これを拡大・縮小させる方法をご存じないでしょうか。画像の一部を切り出すソースは以下のとおりです。 まず,フォームにピクチャボックス(PictureBox1)とコマンドボタン(Button1)を配置し,ソリューションを置いているフォルダ内のbinフォルダにWinter.jpg(WinXPのマイピクチャに入っているものです)を入れておきます。次に,Button1のコードとして,以下のものを打ち込みました。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'Bitmapオブジェクトの作成(切り取り元画像の指定) Dim bmap = New Bitmap("winter.jpg") '切り取る範囲をRectanleで指定 Dim rect As New Rectangle(10, 20, 100, 200) 'PictureBox1のGraphicsオブジェクトの作成 Dim g As Graphics = PictureBox1.CreateGraphics() '元の画像の指定部分を切り取ってPictureboxの左上隅(x,y = 0,0)に表示する.単位はピクセル. g.DrawImage(bmap, 0, 0, rect, GraphicsUnit.Pixel) 'Graphicsオブジェクトを破棄 g.Dispose() End Sub 以上です。 おそらく,DrawImageの部分を変えればいけるのではないかと思われるのですが,いかがでしょうか。ご助言よろしくお願いいたします。

  • pictureboxの画像を削除するには?

    Visual C# 2008を使用しています。 ボタンを押すとpictureboxに画像が表示されるプログラムを作成しました。 今度は、その表示された画像をクリックし、別のボタンを押すことでその画像が削除できるようにしたいと思っているのですが、うまくプログラムできません。 誰か教えていただけないでしょうか? ソースコードは以下のようになっています。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace algorithm { public partial class Form1 : Form { int space = 10; public Form1() { InitializeComponent(); } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { } private void kihonsyori_Click(object sender, EventArgs e) { if (this.pictureBox1.Image == null) { Bitmap img = new Bitmap(@"C:\Documents and Settings\admin\My Documents\Visual Studio 2008\Projects\algorithm\algorithm\picture\基本処理箱.png"); Graphics g = pictureBox1.CreateGraphics(); g.DrawImage(img, 0, space, 0.4F * img.Width, 0.3F * img.Height); space += 50; img.Dispose(); g.Dispose(); } else { this.pictureBox1.Image.Dispose(); this.pictureBox1.Image = null; } } private void groupBox1_Enter(object sender, EventArgs e) { } private void pictureBox1_Click(object sender, EventArgs e) { } private void hanpuku_Click(object sender, EventArgs e) { if (this.pictureBox1.Image == null) { Bitmap img = new Bitmap(@"C:\Documents and Settings\admin\My Documents\Visual Studio 2008\Projects\algorithm\algorithm\picture\反復箱.png"); Graphics g = pictureBox1.CreateGraphics(); g.DrawImage(img, 0, space, 0.4F * img.Width, 0.3F * img.Height); space += 80; img.Dispose(); g.Dispose(); } else { this.pictureBox1.Image.Dispose(); this.pictureBox1.Image = null; } } private void sentaku_Click(object sender, EventArgs e) { if (this.pictureBox1.Image == null) { Bitmap img = new Bitmap(@"C:\Documents and Settings\admin\My Documents\Visual Studio 2008\Projects\algorithm\algorithm\picture\選択箱.png"); Graphics g = pictureBox1.CreateGraphics(); g.DrawImage(img, 0, space, 0.4F * img.Width, 0.3F * img.Height); space += 80; img.Dispose(); g.Dispose(); } else { this.pictureBox1.Image.Dispose(); this.pictureBox1.Image = null; } } private void sakujyo_Click(object sender, EventArgs e) { pictureBox1.Image = null; space = 0; } } }

  • C# Picturebox 縮小・拡大時の表示方法

    下記のようなコードで、画像の拡大・縮小を行っています。 ただ画像の縮小時、PictureBox内の余分な部分について、(1)縮小前の 画像が残像のように表示されています。 また通常、画像の拡大・縮小前の画像では画像サイズがPictureBoxよりも大きいサイズの 場合、スクロールバーを表示するようにしています。 (2)でも、画像拡大時、スクロールバーが出るには出ているのですが、画像全てを 確認できません。 (1)、(2)の問題について、解決方法をご存知の方、お願いです、、、教えてください。。。 かなり、困ってます。。。。 Bitmap img = new Bitmap(pictureBox1.Image.Tag.ToString()); //PictureBox1のGraphicsオブジェクトの作成 Graphics g = pictureBox1.CreateGraphics(); //拡大・もしくは縮小 RectangleF rect = new RectangleF(0, 0, zoom * img.Width, zoom * img.Height); g.DrawImage(img, rect); //BitmapとGraphicsオブジェクトを破棄 img.Dispose(); g.Dispose();

  • VB6.0にて、ワールド変換(ピクチャーボックスの左下を原点にする)を

    VB6.0にて、ワールド変換(ピクチャーボックスの左下を原点にする)をしたいのですが、 下記のコードを記述するとエラーとなります。 どこが駄目なのかわかりませんので、どなたか教えていただけませんでしょうか? お手数をおかけしますがどうぞよろしくお願いします。 PictureBox1のGraphicsオブジェクトを取得 Dim g As Graphics = Form1.PictureBox1.CreateGraphics() g.TranslateTransform(0, Form1.picturebox1.Height - 1) g.ScaleTransform(1, -1) g.Dispose()

  • VB2010にて、文字を上下鏡反転したいのですが、どなたか教えていただ

    VB2010にて、文字を上下鏡反転したいのですが、どなたか教えていただけないでしょうか。 マトリックスでピクチャーボックスの左下を原点としてグラフ描画できましたが、 文字が逆さまになってしまいました。 ピクチャーボックスに、グラフィクスオブジェクトを使い ビットマップイメージで描画して文字を上下反転しようと試みています。 以下のコードで、 Me.PictureBox1.Image.RotateFlip(RotateFlipType.RotateNoneFlipY) の部分がエラーとなってしまいます。 どう修正すればよいか教えていただけませんでしょうか。 どうぞよろしくお願いいたします。 Dim myPen As New Pen(Color.Red, 1) Dim myFont As New Font("MS UI Gothic", 20) Dim myMatrix As New Matrix 'Dim g As Graphics = Me.PictureBox1.CreateGraphics Dim Image2 As New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height) Dim pg As Graphics = Graphics.FromImage(Image2) Dim px, py As Long px = Me.PictureBox1.Width py = Me.PictureBox1.Height myMatrix.Scale(1, -1) '拡大縮小(y軸のみ正負の方向を逆にする) myMatrix.Translate(0, -py) '平行移動(ピクチャーボックスの高さ分,下へ平行移動) 'g.Transform = myMatrix pg.Transform = myMatrix 'g.DrawLine(myPen, 0, 0, 200, 200) pg.DrawLine(myPen, 0, 0, 200, 200) 'g.DrawString("text", myFont, Brushes.Red, 100, 100) pg.DrawString("text", myFont, Brushes.Red, 100, 100) '"text"を上下反転する 'Me.PictureBox1.Image = Image.FromFile("C:\☆test.bmp") Me.PictureBox1.Image.RotateFlip(RotateFlipType.RotateNoneFlipY) Me.PictureBox1.Refresh()

  • VB2010 DBから値取得→パス指定で画像表示

    VB2010でPictureBoxを使用してデータベースから値を取得して PictureBox1.Image =System.Drawing.Image.FromFile("取得した値" & ".jpg") という形でPictureBoxに画像を表示させたいのですが FileNotFoundExceptionはハンドルされませんでした。とエラーが出てできません。 Dim command As SqlClient.SqlCommand = connection.CreateCommand() connection.Open() Dim dr As SqlClient.SqlDataReader command.CommandText = "SELECT s_code FROM テーブル名 ORDER BY s_code" dr = command.ExecuteReader() PictureBox1.Image =System.Drawing.Image.FromFile("..\..\pict" & "dr(s_code)" & ".jpg") データベースのs_codeとpictのフォルダ内にあるパスは一緒です。

  • vb2010で2つのフォームを同時制御

    vb2010でプロジェクトを作成しています。 Form1がメインで、Form2を観客用に用意しています。 Form1のButton1をクリックすると、Form2のPictureBox1に画像を表示させたく、 下のようなプログラムを書いたのですが、Form2に画像が表示されないばかりか、 「オブジェクト参照がオブジェクトインスタンスに設定されていません。」というエラーまではかれてしまいます。このエラーの意味もわからないほど、素人なのでわかる方どうかよろしくお願いします。 ------------------------------------------------------------------------------ Private Sub Form1_Load Dim g As New Form2 g.Show() ------------------------------------------------------------------------------ Private Sub Button1_Click Form2.PictureBox1.Image = Image.FromFile("C/xxxxxxx.png") Form2.Refresh() ------------------------------------------------------------------------------

  • VB.NETでPictureBoxへの描画について

    VB.NETでPictureBoxへの描画について PictureBoxに画像を表示し、余白部分を含めて、マウスで描画できる処理を作成しているのですが、 どうも上手くいかない為、皆さんの知恵をお借りしたいと思い質問させて頂きました。 まず、880×560のPictureBoxを用意し、その中に、600×480の画像を埋め込んでいます。 そのPictureBoxの中で、画像以外の部分(余白)にもマウスで線等を書きたいのです。 画像のみに描く場合は上手くいくのですが、余白を含めると上手くいかなくなってしまい、 困っております。 プログラムの違いは以下の箇所のみです。2の場合は上手くいきます。 1.PictureBox全体に描画する(画像も含め) Dim g As Graphics = PictureBox1.CreateGraphics 2.画像のみに描画する Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) ちなみに、マウスではなく、ボタンクリック時に描画した時は、1の場合でも上手くいきます。 お手数ですが、ご回答の程、よろしくお願いします。

専門家に質問してみよう