如何使用asp.net正确旋转图像?

时间:2010-05-28 15:25:50

标签: .net asp.net image-processing

我想用asp.net旋转图像。我使用了TranslateTransform和RotateTransform。旋转后,图像被损坏。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

这是一个链接,显示如何使用System.Drawing正确执行此操作:

http://forums.asp.net/p/1234460/2239261.aspx

post的相关代码:

public Bitmap RotateBitmap(float Angle, Bitmap bm_in)
{
    try
    {
        float wid = bm_in.Width;
        float hgt = bm_in.Height;
        Point[] corners = { new Point(0, 0), new Point(int.Parse(wid.ToString()), 0), new Point(0, int.Parse(hgt.ToString())), new Point(int.Parse(wid.ToString()), int.Parse(hgt.ToString())) };
        int cx = int.Parse(wid.ToString()) / 2;
        int cy = int.Parse(hgt.ToString()) / 2;
        long i;
        for (i = 0; i <= 3; i++)
        {
            corners[i].X -= Convert.ToInt32(cx.ToString());
            corners[i].Y -= Convert.ToInt32(cy.ToString());
        }

        float theta = (float)(Angle * Math.PI / 180.0);
        float sin_theta = (float)Math.Sin(theta);
        float cos_theta = (float)Math.Cos(theta);
        float X;
        float Y;
        for (i = 0; i <= 3; i++)
        {
            X = corners[i].X;
            Y = corners[i].Y;
            corners[i].X = (int)(X * cos_theta + Y * sin_theta);
            corners[i].Y = (int)(-X * sin_theta + Y * cos_theta);
        }

        float xmin = corners[0].X;
        float ymin = corners[0].Y;
        for (i = 1; i <= 3; i++)
        {
            if (xmin > corners[i].X)
                xmin = corners[i].X;
            if (ymin > corners[i].Y)
                ymin = corners[i].Y;
        }
        for (i = 0; i <= 3; i++)
        {
            corners[i].X -= int.Parse(xmin.ToString());
            corners[i].Y -= int.Parse(ymin.ToString());
        }

        Bitmap bm_out = new Bitmap((int)(-2 * xmin), (int)(-2 * ymin));
        Graphics gr_out = Graphics.FromImage(bm_out);
        // ERROR: Not supported in C#: ReDimStatement
        Point[] temp = new Point[3];
        if (corners != null)
        {
            Array.Copy(corners, temp, Math.Min(corners.Length, temp.Length));
        }
        corners = temp;
        gr_out.DrawImage(bm_in, corners);
        return bm_out;
    }
    catch (Exception ex)
    {
        string s = ex.Message;
        return bm_in;
    }
}