10

私のC#プログラムには、ビデオのストリーム(連続フレーム)を表示したいPictureboxがあります。生データを受け取り、それをビットマップまたはイメージに変換します。一度に 1 つの画像を問題なく表示できます (ビデオ ストリームを再生するため)。

今私の問題は、同じサイズとアルファ値 (ARGB) を持つ 2 つ以上のビットマップ (レイヤーなど) をマージし、それを picturebox に表示したいということです。

SO に関する多くの Web サイトや投稿を読みましたが、多くは Graphics クラスを使用しており、自分のアプリケーションでそれを描画することはできません (おそらく、C# を初めて使用し、プログラムのセットアップが既に完了しているためです)。構造を変更したくありませんでした)。

私が必要とするもの(知っておくべきこと):

  1. アルファ値を持つ 2 つ以上のビットマップをオーバーレイする方法。
  2. ピクセル操作は行わないでください。パフォーマンスにそのコストがかかるわけではありません。

よろしくお願いします!

注: SO で見つかったものはすべて、ピクセル操作または Graphics クラスを使用して行われるため、この質問を重複としてマーク (またはクローズ) するべきではないと思います。(でも間違ってるかも!)

編集: 考えられる回避策 (質問の解決策ではありません
) A PictureBox Problemの 4 番目の回答 (ユーザー comecme から) は、2 つの画像ボックスを重ねるように指示しています。このアプローチで機能させるために私がしなければならなかった唯一の(追加の)ことは:

private void Form1_Load(object sender, EventArgs e)
{
    pictureBox2.Parent = pictureBox1;
}

pictureBox2 が一番上になります。

私はこれを回避策と考えているので、これをこの問題に対する答えとは考えません (特に、10 個以上のピクチャボックスを持つことは理想的ではないようです! 笑)。そのため、この質問を開いたままにして、私の質問に対する実際の回答を待ちます.

編集:解決しました!私の答えを確認してください。

4

1 に答える 1

12

これが私の問題に対する本当の答えです。
1) a を使用しList<Bitmap>て、ブレンドするすべての画像を保存します。
2) 最終イメージを保持する新しいビットマップを作成します。3)ステートメントを使用して
、最終的な画像の上に各画像を描画します。graphicsusing

コード:

List<Bitmap> images = new List<Bitmap>();  
Bitmap finalImage = new Bitmap(640, 480);

...

//For each layer, I transform the data into a Bitmap (doesn't matter what kind of
//data, in this question) and add it to the images list
for (int i = 0; i < nLayers; ++i)
{
    Bitmap bitmap = new Bitmap(layerBitmapData[i]));
    images.Add(bitmap);
}

using (Graphics g = Graphics.FromImage(finalImage))
{
    //set background color
    g.Clear(Color.Black);

    //go through each image and draw it on the final image (Notice the offset; since I want to overlay the images i won't have any offset between the images in the finalImage)
    int offset = 0;
    foreach (Bitmap image in images)
    {
        g.DrawImage(image, new Rectangle(offset, 0, image.Width, image.Height));
    }   
}
//Draw the final image in the pictureBox
this.layersBox.Image = finalImage;
//In my case I clear the List because i run this in a cycle and the number of layers is not fixed 
images.Clear();

クレジットは、この tech.pro Web ページのBrandon Cannadayに送られます。

于 2013-02-04T16:53:00.183 に答える