Transformation (Rotation) des Bildes unter Verwendung von Matrix - Entwurfszeit vs. Laufzeit-Rendering Ergebnisse

StackOverflow https://stackoverflow.com/questions/1124105

Frage

Ich habe ein 48x48 Bild, welches eine Transformationsmatrix gedreht werden.

Aus irgendeinem Grund das gedrehte Bild in Design-Zeit unterscheidet sich von dem gedrehten Bild in Laufzeit, wie Sie von Screenshot (Link tot) (Entwurfszeit auf der linken Seite, Laufzeit auf der rechten Seite):

Es könnte ein wenig schwierig sein, zu erkennen, aber wenn man genau am rechten Rande des blauen Kreises betrachtet, ist es einen Pixel breiten im Bild rechts zu. Beachten Sie, dass das Bild geschichtet -. Die weiße Glut im Vordergrund ist der Teil, der gedreht ist wird, während die blaue Kugel im Hintergrund statisch ist

Es scheint, wie das Bild versetzt ist 1 Pixel in der Laufzeit, wenn sie sich drehen genau 90 Grad (wie im Screenshot), 180 Grad und wahrscheinlich auch um 270 Grad. Das Bild sieht gleich mit einem anderen Drehwinkel, soweit ich sehen kann.

Hier ist ein Ausschnitt:

protected static Image RotateImage(Image pImage, Single pAngle)
    {
      Matrix lMatrix = new Matrix();
      lMatrix.RotateAt(pAngle, new PointF(pImage.Width / 2, pImage.Height / 2));
      Bitmap lNewBitmap = new Bitmap(pImage.Width, pImage.Height);
      lNewBitmap.SetResolution(pImage.HorizontalResolution, pImage.VerticalResolution);
      Graphics lGraphics = Graphics.FromImage(lNewBitmap);
      lGraphics.Transform = lMatrix;
      lGraphics.DrawImage(pImage, 0, 0);
      lGraphics.Dispose();
      lMatrix.Dispose();
      return lNewBitmap;
    }

    void SomeMethod()
    {
      // Same results in design-time and run-time:
      PictureBox1.Image = RotateImage(PictureBox2.Image, 18)
      // Different results in design-time and run-time.
      PictureBox1.Image = RotateImage(PictureBox2.Image, 90)
    }

Kann jemand den Grund für dieses Verhalten erklären? Oder noch besser, eine Lösung zu machen Laufzeit Ergebnisse aussehen Entwurfszeitergebnisse?

Es ist für mich wichtig, weil dieses Bild ist Teil einer Animation, die aus dem Code basiert auf einem einzigen Bild erzeugt wird, die dann in kleinen Schritten gedreht wird. In Entwurfszeit sieht die Animation glatt und schön. In der Laufzeit sieht es aus wie es herumspringen: /

Ich bin mit Visual Studio 2005 auf Windows Vista Business SP2.

War es hilfreich?

Lösung

Es könnte etwas mit Unterschieden in den Grafiken zu tun Objekt zur Entwurfszeit verwendet als Funktion der Zeit, wie die PixelOffsetMode ausgeführt werden.

Andere Tipps

Wie spezifizieren Sie Ihre Drehwinkel? in Grad oder in Radiant?

Manchmal erhalte Ergebnisse, wie ich diejenigen, die Sie beschreiben, wenn ich meinen Winkel zufällig habe in Grad angegeben, wenn es gewesen Radianten haben sollte (und als Ergebnis wird das Objekt gedreht wurde mehrere hundert Grad statt wenig)

Ich weiß nicht sicher gegeben, spezifische Beispiel, aber es lohnt sich hindeutet.

Hm, meine Überlegung ist, zu versuchen:

lMatrix.RotateAt(pAngle, new PointF((pImage.Width + 1)/2.0f, (pImage.Height + 1)/ 2.0f));

Ich denke, dass ein Problem, über die Mathematik sollte in Gleitkomma durchgeführt wird; bei der Wiedergabe auf ganzzahlige Koordinaten gerundet wird.

Eine Frage, die relevant sein könnte ... ist Ihr Bild vollständig quadratisch und die Breite und Höhe eine gerade Zahl? Vielleicht gibt das Problem liegt.

Bearbeiten : In der ersten Lese ich durch die Abmessungen des Bildes vergangen ... Wenn das nicht das Problem, vielleicht war sie selbst eine einfache Drehung tun könnte:

angle = 90 : img[i][j] = img[j][w-i]
angle = 180: img[i][j] = img[w-i][w-j]
angle = 270: img[i][j] = img[w-j][i]

(Ich denke, der Index Auslagerungen ist ok, aber eine doppelte Überprüfung wird nicht schlecht sein)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top