2016-09-17 8 views
2

Ich versuche, eine Animation eines Rades mit Timer in C# drehen (Rad Bild auf BildBox).rotierendes Bild auf Timer ohne das Bild zu mischen

Verfahren zum Drehen Bild:

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; 
    } 

// Code für Zeitgebertick

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

das Bild des Rades Spinn halten und die Farbe wird das Mischen und dann das Bild gerade ausgeblendet. Wie kann ich das beheben?

+0

Was ist 'anglePerSec' und was ist' timer1.Interval'? Hast du versucht, das Intervall zu erhöhen? – SergeyS

Antwort

1

Wenn ein Bild um 90 Grad oder einen Winkel gedreht wird, der ein exaktes Vielfaches von 90 ist, werden alle Pixel beibehalten und sie bewegen sich einfach an ihre neue Position. Wenn Sie jedoch in einem anderen Winkel rotieren, findet ein Resampling oder eine Approximation statt, und kein einzelnes Pixel bewegt sich zu einer neuen Pixelposition, da die Pixelpositionen Ganzzahlen sind, aber Rotationen in solchen Winkeln nicht-ganzzahlige Positionen erzeugen. Dies bedeutet, dass die neue Farbe jedes Pixels aus dem Mischen zwischen 4 und 6 Pixeln aus dem vorrotierten Bild entsteht. Diese Überblendung verursacht das Fading, das Sie sehen. Infolgedessen führen wiederholte Rotationen immer mehr Verzerrungen ein, bis das Bild signifikant verändert oder sogar vollständig zerstört ist.

Die Lösung besteht darin, eine Kopie des ursprünglichen Bildes zu erstellen, dann jedes Mal die ursprüngliche Kopie wiederherzustellen und im neuen Winkel zu drehen. Auf diese Weise erhalten Sie immer eine einzige Rotation, und Sie werden keine Verzerrungen akkumulieren.

Verwandte Themen