C#合并两个旋转的位图

时间:2015-11-18 02:19:02

标签: c# winforms bitmap rotation image-rotation

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

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图片及其旋转版本。

1 个答案:

答案 0 :(得分:2)

绘制到从Graphics实例获取的Bitmap对象不首先清除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);
}

当然,您应该将用于绘制以特定角度旋转的位图的代码放入其自己的方法中,以便您没有代码的两个副本。但上述内容应该解决您的基本问题。