0

2 つの画像を読み込み、それらにいくつかの変換 (スケーリング/回転) を適用し、.NET Graphics クラスを使用して別の画像の特定の時点でそれらを描画するメソッドを作成しています。

私が現在試みているプロセスは次のとおりです。

Load bmp1
Load bmp2
Create graphics object from bmp1
Apply tranformations
Save
Repeat process for bmp2
Instantiate new merged bmp obj
Create graphics object from merged bmp
Draw bmp1 & bmp2 on merged bmp
Save

私は以下のコードでこれをやろうとしています:

// load existing bmps
var bmp1 = new Bitmap(Path.Combine(_staticIconsPath, staticIcon.Filename));
var bmp2 = new Bitmap(Path.Combine(_movableIconsPath, movableIcon.Filename));

// apply transforms to bmp1
var canvas1 = Graphics.FromImage(bmp1);
canvas1.ScaleTransform(0.5f, 0.5f);
canvas1.RotateTransform(45.0f);
canvas1.Save();

// apply transforms to bmp2
var canvas2 = Graphics.FromImage(bmp2);
canvas2.ScaleTransform(0.5f, 0.5f);
canvas2.RotateTransform(45.0f);
canvas2.Save();

// create final merged bmp
var mergedBmp = new Bitmap(590, 590);
mergedBmp.SetResolution(bmp1.HorizontalResolution, bmp1.VerticalResolution);

// draw transformed images on to final bmp
var mergedCanvas = Graphics.FromImage(mergedBmp);
mergedCanvas.DrawImage(bmp1, 0, 0);
mergedCanvas.DrawImage(bmp2, 0, 0);

mergedCanvas.Save();

ただし、最終的な結果は、ロードされた 2 つの元のビットマップであり、期待どおりに両方とも重ねて描画されますが、変換は適用されません。

以前に GDI を使用したり、画像操作を行ったりしたことがないため、従わなければならないプロセスについて基本的なことを誤解していると思います。誰かが私を助けて、正しい方向に向けることができますか?

4

2 に答える 2

2

canevas という名前の変換を、それぞれの bmp ファイルに保存する必要があります。これらの bmp を使用して、マージされたファイルを描画できます。ただし、同じ場所にある 2 つの画像は最後の 1 つしか表示されないため、画像を描画するときに同じ場所を設定しないでください。

            // load existing bmps 
        var bmp1 = new Bitmap("test2.bmp");
        var bmp2 = new Bitmap("test2.bmp");

        // apply transforms to bmp1 
        var canvas1 = Graphics.FromImage(bmp1);
        canvas1.ScaleTransform(0.5f, 0.5f);
        canvas1.RotateTransform(45.0f);
        canvas1.Save();
        canvas1.DrawImage(bmp1,100, 0);
        bmp1.Save("test1res.bmp");
        var bmpres1 = new Bitmap("test1res.bmp");

        // apply transforms to bmp2
        var resbmp2 = new Bitmap(1000, 1000);
        var canvas2 = Graphics.FromImage(bmp2);
        canvas2.ScaleTransform(0.5f, 0.5f);
        canvas2.RotateTransform(45.0f);
        canvas2.Save();
        canvas2.DrawImage(bmp2, 100, 0);
        bmp2.Save("test2res.bmp");
        var bmpres2 = new Bitmap("test2res.bmp");

        // create final merged bmp 
        var mergedBmp = new Bitmap(1000, 1000);
        mergedBmp.SetResolution(bmp1.HorizontalResolution, bmp1.VerticalResolution);

        // draw transformed images on to final bmp 
        var mergedCanvas = Graphics.FromImage(mergedBmp);
        mergedCanvas.DrawImage(bmpres1, 0, 0);
        mergedCanvas.DrawImage(bmpres2, 500, 0);

        mergedCanvas.Save();
        Graphics graph = mergedCanvas;
       // Bitmap bmpPicture = new Bitmap("test2.bmp");
        graph.DrawImage(mergedBmp, 0, 0);

        mergedBmp.Save("res.bmp");
于 2012-07-28T10:55:03.150 に答える
1

はい、あなたはそれを間違っています。Graphics オブジェクトの変更は、実際に描画しない限り効果がありません。あなたはそうではありませんが、mergedCanvas でのみ描画します。したがって、次のようにコードを並べ替えます。

var mergedBmp = new Bitmap(590, 590);
using (var bmp1 = new Bitmap(Path.Combine(_staticIconsPath, staticIcon.Filename)))
using (var bmp2 = new Bitmap(Path.Combine(_movableIconsPath, movableIcon.Filename)))
using (var mergedCanvas = Graphics.FromImage(mergedBmp)) {
    mergedCanvas.Save();
    mergedCanvas.ScaleTransform(0.5f, 0.5f);
    mergedCanvas.DrawImage(bmp1, 0, 0);
    mergedCanvas.Restore();
    mergedCanvas.ScaleTransform(-0.5f, -0.5f);
    mergedCanvas.DrawImage(bmp2, 0, 0);
}

これらのusingステートメントをスキップしないでください。ビットマップでは非常に重要です。

于 2012-07-28T12:16:37.647 に答える