none
複数 Bitmap の 連結 RRS feed

  • 質問

  • C# 2005 です。

    2つのビットマップファイルを 読み込んで、1つのビットマップファイルにしたいです。

    ビットマップファイル B1.bmp       中身(○)

    ビットマップファイル B2.bmp  中身(×)

    作成するファイル   B3.bmp     中身 (○×)


    Bitmap  b1  =  new Bitmap(  "B1.bmp"  );

    Bitmap  b2  =  new Bitmap(  "B2.bmp"  );

    Bitmap  b3  =  b1 + b2;  <==  このような イメージ です。

    どなたか 教えてください。



    2009年12月18日 10:14

回答

  • Graphics.FromImage() でGraphcisを取得して、今度は取得したGraphicsに対してDrawImage() します。
    つまり

    Bitmap b1 = new Bitmap( "B1.bmp" );
    Bitmap b2 = new Bitmap( "B2.bmp" );
    Bitmap b3 = new Bitmap( 2, 1 );
    using( Graphics g3 = Graphics.FromImage( b3 ) ){
      g3.DrawImage( b1, 0, 0 );
      g3.DrawImage( b2, 1, 0 );
    }

    これでb3にb1+b2された画像が作成されます。
    グラフィックス プログラミングについて も参考になります。
    • 回答としてマーク 丸中太郎 2009年12月19日 2:51
    2009年12月19日 1:46
  • 回答ありがとうございます。

    2つの ビットマップファイルを 横に連結する 方法 として まとめてみました。

    ビットマップの 大きさは 2つとも 1×1です。


    フォームに ピクチャーボックスを 1つ いれて やってみました。

    private void Form1_Paint(object sender, PaintEventArgs e)
            {           
        Bitmap  b1  =  new(  "B1.bmp"  );

        Bitmap  b2  =  new(  "B2.bmp"  );

                Bitmap  b3  =  new(  2,  1  );

                using(  Graphics  gg  =  Graphics.FromImage(  b3  )  )
                using(  Graphics  g1  =  pictureBox1.CreateGraphics()  )
                {
                      gg.DrawImage(  b1,  0,  0  );
                      gg.DrawImage(  b2,  1,  0  );
                      
                      g1.DrawImage(  b3,  0,  0  );
                }
            }


    以上 ありがとうございました。

    • 回答としてマーク 丸中太郎 2009年12月19日 2:51
    2009年12月19日 2:47

すべての返信

  • 縦に連結するのか横に連結するのか、あるいは色を合成するのか、どうなのでしょうか?
    二つの画像の縦横のサイズが違った場合は?

    連結なら、サイズを指定して Bitmap を new し、Graphics.FromImage でこの Bitmap を操作するための Graphics を取得して、元となる Bitmap 二つをそれぞれ DrawImage します。
    2009年12月18日 10:31
  • 回答ありがとうございます。

    連結する画像は縦横のサイズは 同じです。

    横に 連結 します。

    画像1 ○   サイズ(1,1)

    画像2 ×   サイズ(1,1)

    作成する画像 ○× サイズ(2,1)

    です。

    Bitmap  b1  =  new Bitmap(  "B1.bmp"  );

    Bitmap  b2  =  new Bitmap(  "B2.bmp"  );

    Bitmap  b3  =  new Bitmap(  2,  1  );

    Graphics  g1  =  Graphics.FromImage(  b1  );

    このような 感じでしょうか?


    2009年12月19日 1:05
  • フォームに ピクチャーボックスを 1つ いれて やってみました。

    private void Form1_Paint(object sender, PaintEventArgs e)
            {
                Graphics  gg  =  pictureBox1.CreateGraphics();

        Bitmap  b1  =  new(  "B1.bmp"  );

        Bitmap  b2  =  new(  "B2.bmp"  );

                gg.DrawImage(  b1,  0,  0  );

                gg.DrawImage(  b2,  b1.Width,  0  );

            }

    ピクチャーボックスには 連結して表示されました。

    しかし、グラフィック から イメージ へ 変換 できません。

    Graphics を 使わずに Bitmap だけでは 連結できませんでしょうか?

    2009年12月19日 1:45
  • Graphics.FromImage() でGraphcisを取得して、今度は取得したGraphicsに対してDrawImage() します。
    つまり

    Bitmap b1 = new Bitmap( "B1.bmp" );
    Bitmap b2 = new Bitmap( "B2.bmp" );
    Bitmap b3 = new Bitmap( 2, 1 );
    using( Graphics g3 = Graphics.FromImage( b3 ) ){
      g3.DrawImage( b1, 0, 0 );
      g3.DrawImage( b2, 1, 0 );
    }

    これでb3にb1+b2された画像が作成されます。
    グラフィックス プログラミングについて も参考になります。
    • 回答としてマーク 丸中太郎 2009年12月19日 2:51
    2009年12月19日 1:46
  • 動的に画像を作成する方法として下記のページが参考になると思います。
    http://dobon.net/vb/dotnet/graphics/createimage.html


    b3 を元に Graphics を作り、b1 と b2 を DrawImage し、b3 を保存するような流れです。
    なお、Bitmap コンストラクタに渡すサイズや DrawImage に渡す座標は、(基本的に)ピクセル単位です。枚数ではありませんので、b1 と b2 の Width/Height から適切な値を求めてください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2009年12月19日 1:49
    モデレータ
  • 回答ありがとうございます。

    2つの ビットマップファイルを 横に連結する 方法 として まとめてみました。

    ビットマップの 大きさは 2つとも 1×1です。


    フォームに ピクチャーボックスを 1つ いれて やってみました。

    private void Form1_Paint(object sender, PaintEventArgs e)
            {           
        Bitmap  b1  =  new(  "B1.bmp"  );

        Bitmap  b2  =  new(  "B2.bmp"  );

                Bitmap  b3  =  new(  2,  1  );

                using(  Graphics  gg  =  Graphics.FromImage(  b3  )  )
                using(  Graphics  g1  =  pictureBox1.CreateGraphics()  )
                {
                      gg.DrawImage(  b1,  0,  0  );
                      gg.DrawImage(  b2,  1,  0  );
                      
                      g1.DrawImage(  b3,  0,  0  );
                }
            }


    以上 ありがとうございました。

    • 回答としてマーク 丸中太郎 2009年12月19日 2:51
    2009年12月19日 2:47
  • Form1_Paint()とかpictureBox1.CreateGraphics()とか、何がやりたいのかよくわかりません。
    メソッド名を見る限り、2重にも3重にも間違ったことをやっています。

    まずpictureBox1に画像を表示させるのなら、pictureBox1.Image = b3; で十分です。
    Form1_Paint()はメソッド名から推測するとForm1が再描画するたびに呼ばれます。しかし、pictureBoox1はあらかじめ保持しているImageを適切に描画するため、Form1_Paint()で毎回更新する必要はありません。
    2009年12月19日 2:57