C#合并两个旋转的位图

C# merge two rotated bitmaps

我正在尝试旋转两个位图,然后将结果复制到第三个位图中。

Bitmap bmp_1 = new Bitmap(Program.Properties.Resources.MyImage); // 100x100 px
Bitmap bmp_2 = new Bitmap(Program.Properties.Resources.MyImage); // 100x100 px
Bitmap bmp_merged = new Bitmap(200, 100, PixelFormat.Format32bppArgb);

float angle, bw2, bh2;

using (Graphics g = Graphics.FromImage(bmp_merged))
{
    using (Graphics graphics = Graphics.FromImage(bmp_1))
    {
        angle = 15;

        bw2 = bmp_1.Width / 2f;
        bh2 = bmp_1.Height / 2f;

        graphics.TranslateTransform(bw2, bh2);
        graphics.RotateTransform(angle);
        graphics.TranslateTransform(-bw2, -bh2);
        graphics.DrawImage(bmp_1, 0, 0);
    }
    using (Graphics graphics = Graphics.FromImage(bmp_2))
    {
        angle = 35;

        bw2 = bmp_2.Width / 2f;
        bh2 = bmp_2.Height / 2f;

        graphics.TranslateTransform(bw2, bh2);
        graphics.RotateTransform(angle);
        graphics.TranslateTransform(-bw2, -bh2);
        graphics.DrawImage(bmp_2, 0, 0);
    }
    g.DrawImage(bmp_1, 0, 0);
    g.DrawImage(bmp_2, 100, 0);
}

问题:

使用 graphics.DrawImage(bmp_1, 0, 0); 后,我预计 bmp_1 将是旋转图像。

但它实际上是原始 bmp_1 图像及其在其上绘制的旋转版本。

绘制到从 Bitmap 实例获得的 Graphics 对象中不会首先清除 Bitmap 实例。它只是在现有内容之上绘制。

与其修改开始时的位图,不如将它们旋转绘制到目标位置。例如,像这样:

using (Graphics g = Graphics.FromImage(bmp_merged))
{
    angle = 15;

    bw2 = bmp_1.Width / 2f;
    bh2 = bmp_1.Height / 2f;

    g.TranslateTransform(bw2, bh2);
    g.RotateTransform(angle);
    g.TranslateTransform(-bw2, -bh2);
    g.DrawImage(bmp_1, 0, 0);

    angle = 35;

    bw2 = bmp_2.Width / 2f;
    bh2 = bmp_2.Height / 2f;

    g.ResetTransform();
    g.TranslateTransform(bw2, bh2);
    g.RotateTransform(angle);
    g.TranslateTransform(-bw2, -bh2);
    g.DrawImage(bmp_2, 0, 0);
}

当然,您应该真正将绘制以特定角度旋转的位图的代码分解到它自己的方法中,这样您就不会拥有两份代码。但以上内容应该可以解决您的基本问题。