Raster bei PicBox Rotation

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Trade.

    Raster bei PicBox Rotation

    Hey Leute,

    ich habe eine Frage meinem PictureBox RotationsScript.

    Ich hab mal ein vergleichbares Projekt erstellt und unten angehängt.

    Erklärung:
    2 Modi:
    1. Modus: Farbe wird gedreht
    2. Modus: Es wird dort Color.Maroon gesetzt, wo eine gedrehte Pixel sitzen würde

    Das Programm berechnet jeweils anhand der Drehmatrize aus der 4. Antwort dieser Seite: Link, wo die um x Grad gedrehte Pixel liegen würde.

    Problem:
    Man erkennt jedoch (am stärksten bei Winkeln um 45° - beispielsweise), dass ein deutliches Raster entsteht!

    Frage:
    -> Drum meine Frage:
    Fällt euch eine bessere Möglichkeit ein, als im Vorraus das Bild zu vervierfachen (jeweils Pixel breit ziehen), dann "vervierfacht" zu drehen und dann wieder klein zu rechnen?
    Dann wäre nämlich die Wahrscheinlichkeit, dass ein Pixel besetzt wird, 4 mal so groß und damit wäre jeder Pixel besetzt (sind ja jetzt schon nur relativ wenige die unbesetzt sind)

    Es wäre kein Problem aber das zieht halt doch Rechenleistung, wenn das Programm jede ForSchleifen-Aktion 4 mal so häufig machen muss° :(

    LG und hoffentlich fällt euch was besseres ein
    mixing_guy
    Dateien
    Die Darstellung eines Controls kann man sehr wunderbar mitte Matrix-Klasse drehen , also der Transform-Property eine geeignet eingestellte Matrix zuweisen.

    Achnee, man musses im Paint-Event machen, und dem Graphics-Objekt eine Matrix andrehen.


    Die "Maroon-Drehung" in deim Projekt hab ich nicht verstanden.
    1.) Es geht nicht um die Darstellung eines Controls sondern um die Drehung eines Bildes innerhalb einer PictureBox

    2.) Die "Maroon-Drehung" wie du es nennst ist einfach nochmal als einfarbiger Kontrast eingebaut, damit man sehen kann, wo eine Pixel gesetzt wird / werden würde und wo nicht! - Daran wird also deutlich, dass die KommaZahlen Berechnung nicht für jede Pixel einen Farbwert übrig hat!

    und genau da entsteht eben mein Problem mit der Rasterbildung!

    Edit://
    Gehen soll es übrigens um ein DJ-Programm und da dreht sich eben das Lied-Cover beim abspielen. Also berechne ich am Anfang für rund 10 Drehungspositionen ein Bild und lasse die dann per Timer flüssig wechseln um eine Drehung zu erzeugen. Gott sei dank ist das menschliche Auge langsam ;)

    Edit 2://
    Ich weiß du bist schon ewig dabei, aber es wäre echt cool, wenn du
    ​ErfinderDesRades
    auch Edits verwenden/setzten könntest - ist sonst echt schwer zum mitverfolgen!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „mixing_guy“ ()

    LÖSUNG FÜR ALLE!

    Ich verwende jetzt endgültig diesen Code:

    Quellcode

    1. ​Imports System
    2. Imports System.Drawing
    3. Imports System.Math
    4. Imports System.Drawing.Drawing2D
    5. Public Class Form1
    6. Public Function RotatePoint(ByVal x As Decimal, ByVal y As Decimal, ByVal center As Point, ByVal degrees As Double) As PointF
    7. degrees = degrees * PI / 180
    8. Dim newx = center.X + ((x - center.X) * Cos(degrees)) - ((y - center.Y) * Sin(degrees))
    9. Dim newy = center.Y + ((x - center.X) * Sin(degrees)) + ((y - center.Y) * Cos(degrees))
    10. Return New PointF(newx, newy)
    11. End Function
    12. Public Function ImgRotate(src As Image, degrees As Double) As Image
    13. Dim z = New Bitmap(picget.Width, picget.Height)
    14. Dim g = Graphics.FromImage(z)
    15. Dim img = picget.Image
    16. Dim ulCorner As PointF = RotatePoint(0, 0, New Point(src.Width / 2, src.Height / 2), degrees)
    17. Dim urCorner As PointF = RotatePoint(src.Width - 1, 0, New Point(src.Width / 2, src.Height / 2), degrees)
    18. Dim llCorner As PointF = RotatePoint(0, src.Height - 1, New Point(src.Width / 2, src.Height / 2), degrees)
    19. Dim points() As PointF = {ulCorner, urCorner, llCorner}
    20. g.DrawImage(img, points)
    21. g = Graphics.FromImage(z)
    22. Return z
    23. End Function
    24. End Class


    Ihr sehts:
    Die Funktion ImgRotate rotiert ein angegebenes Bild um sich selbst, wobei der Mittelpunkt der Drehung auch der Mittelpunkt des Bilds ist!
    Zurückgegeben wird das rotierte Bild!

    Anwendungsbeispiel:

    Quellcode

    1. ​ImgRotate(Source.Image, 45)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mixing_guy“ ()

    naja, ich habs nu auch gecodet - scheinbar haben wir uns zeitlich überschnitten

    VB.NET-Quellcode

    1. Private _Bmp1, _Bmp2 As Bitmap
    2. '...
    3. Private Sub Rotate(angle As Single)
    4. Dim pts = {New Point(0, 0), New Point(_Bmp1.Width, 0), New Point(0, _Bmp1.Height)}
    5. Dim mid = New Point(_Bmp1.Width \ 2, _Bmp1.Height \ 2)
    6. Using g = Graphics.FromImage(_Bmp2), mtr As New Matrix
    7. mtr.RotateAt(angle, mid)
    8. mtr.TransformPoints(pts)
    9. g.Clear(Color.Black)
    10. g.DrawImage(_Bmp1, pts)
    11. End Using
    12. BmpContainer.Panel2.Invalidate() ' (Panel2 zeigt _Bmp2 an - invalidieren refresht die Zeichnung)
    13. End Sub
    14. Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs)
    15. Rotate(NumericUpDown1.Value)
    16. End Sub

    Dateien

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    mixing_guy schrieb:

    LÖSUNG FÜR ALLE!
    Wohl kaum. :thumbdown:
    Pack diesen Code in ein neues Projekt, gib diesem Option Strict On und sieh, was passiert.
    Danach implementierst Du den Code vom @ErfinderDesRades .
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Moin,

    das geht gar nicht. Du willst also schlechte Lösungen verbreiten, nur weil "Scriptkiddies" das eh nicht richtig lernen müssen? Und was ist mit Leuten, die es lernen wollen?
    Schalte mal ganz fix Strict On.

    Grüße


    ErfinderDesRades: Ich schließe mal vorsichtshalber, damit kein Streit aufkommt, wenn dringliche Empfehlungen evtl. als Bevormundung aufgefasst werden. Das Thema ist ja auch erledigt, die Empfehlungen sind ausgesprochen und Alternativen aufgezeigt.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()