定时器上旋转图像而不混合图像

时间:2016-09-17 13:38:30

标签: c# image timer bitmap rotation

我试图在c#中使用计时器制作一个轮子旋转动画(pictureBox上的轮子图像)。

旋转图像的方法:

public static Image RotateImage(Image img, float rotationAngle)
    {
        //create an empty Bitmap image
        Bitmap bmp = new Bitmap(img.Width, img.Height);

        //turn the Bitmap into a Graphics object
        Graphics gfx = Graphics.FromImage(bmp);

        //now we set the rotation point to the center of our image
        gfx.TranslateTransform((float)bmp.Width / 2, (float)bmp.Height / 2);

        //now rotate the image
        gfx.RotateTransform(rotationAngle);

        gfx.TranslateTransform(-(float)bmp.Width / 2, -(float)bmp.Height / 2);

        //set the InterpolationMode to HighQualityBicubic so to ensure a high
        //quality image once it is transformed to the specified size
        gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;

        //now draw our new image onto the graphics object
        gfx.DrawImage(img, new Point(0, 0));

        //dispose of our Graphics object
        gfx.Dispose();

        //return the image
        return bmp;
    }

//计时器滴答的代码

private void timer1_Tick(object sender, EventArgs e)
    {
        float anglePerTick = 0;
        anglePerTick = anglePerSec / 1000 * timer1.Interval;
        pictureBox1.Image = RotateImage(pictureBox1.Image, anglePerTick);
    }

轮子的图像保持旋转,颜色混合,然后图像淡出。 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

当图像旋转90度或任何90°的精确倍数时,所有像素都会被保留,它们只会移动到新位置。但是当您以任何其他角度旋转时,会发生重新采样或近似,并且没有单个像素移动到新的像素位置,因为像素位置是整数,但是在这样的角度旋转会产生非整数位置。这意味着每个像素的新颜色将来自预旋转图像的4到6个像素之间的混合。这种混合会导致你看到的褪色。结果,重复旋转将引入越来越多的失真,直到图像显着改变或甚至完全被破坏。

解决方案是拍摄原始图像的副本,然后每次还原原始副本并以新角度旋转。通过这种方式,您将始终完成一次旋转,并且不会累积失真。