Suche Ideen zur Realisierung - Bildausschnitt live drehen

  • VB.NET

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

    Suche Ideen zur Realisierung - Bildausschnitt live drehen

    Hallo,

    ich habe für mein Problem leider keine Software gefunden, deswegen möchte ich mich selbst ranwagen.
    Ich möchte einen Bildschirmausschnitt (der immer an der selben Position ist, also feste Koordinaten am rechten oberen Bildschirmrand) um 180° drehen und zwar live und unabhängig davon, was gerade auf dem Bildschirm geschieht.

    Mein Ansatz wäre gewesen, diese Stelle zu "screenshotten", das ganze temporär in einem Bitmap Objekt zu speichern, das Objekt zu drehen und im Programm anzeigen zu lassen. Und das eben 60 mal die Sekunde.
    Das Problem, das sich dadurch ergibt ist, dass beim zweiten Screenshot, die Form, in der der gedrehte Ausschnitt des letzten Frames angezeigt wird, ja nicht ignoriert wird. Somit würde der Ausschnitt zum Startzeitpunkt immer nur um 180° gedreht werden und der eigentliche Ausschnitt zum Zeitpunkt X gar nicht gecapturet.

    Ich hoffe ihr könnt mir weiterhelfen. Vielen Dank!

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

    Hallo @DavidVB


    Meinst du eventuell so etwas?
    Text/Bild 90 Grad gedreht

    Ist auf dem Bitmap aufgebaut.

    Antworten zu Screenshot Teilbereiche gibt es auch hier im Forum.
    Screenshot bereich auswählen


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    Hallo,
    die Funktionen habe ich bereits alle programmiert und das Programm tut auch was es soll. Aber das von mir beschriebene Problem kann so trotzdem nicht gelöst werden. Ich habe es notdürftig so gelöst, dass sich die From auf auf invisible stellt, wenn der Screenshot gemacht wird und dann wieder mit dem rotierten Bild aufpoppt. Das führt allerdings beim ausführen zu einem Flackereffekt.
    Dazu müsste man schon deinen Code kennen. So ist es schwer zu erkennen, welche Probleme nun bei dir wirklich bestehen. Sorry

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Class FrmMain
    4. Private bm As Bitmap
    5. Dim counter As Integer = 0
    6. Dim flag As Boolean = False
    7. Private szBm As New Size(200, 200)
    8. Private Sub FrmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    9. SetBitmap()
    10. End Sub
    11. Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
    12. SetBitmap()
    13. Me.Invalidate()
    14. End Sub
    15. Private Sub btnAuto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAuto.Click
    16. SetBitmap()
    17. If flag Then
    18. flag = False
    19. Me.btnAuto.Text = "Automatic"
    20. Me.Timer1.Stop()
    21. Me.Timer1.Enabled = False
    22. Me.btnStart.Enabled = True
    23. Else
    24. flag = True
    25. Me.btnAuto.Text = "Stop"
    26. Me.Timer1.Interval = 16
    27. Me.Timer1.Enabled = True
    28. Me.Timer1.Start()
    29. Me.btnStart.Enabled = False
    30. End If
    31. counter = 0
    32. End Sub
    33. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    34. If Me.Enabled Then
    35. Me.PictureBox1.Image = Nothing
    36. If bm IsNot Nothing Then
    37. Dim modi As Integer = counter Mod 4
    38. Select Case modi
    39. 'Case 0 : stop
    40. Case 1 : bm.RotateFlip(RotateFlipType.Rotate90FlipNone)
    41. Case 2 : bm.RotateFlip(RotateFlipType.Rotate180FlipNone)
    42. Case 3 : bm.RotateFlip(RotateFlipType.Rotate270FlipNone)
    43. End Select
    44. counter += 1
    45. Me.PictureBox1.Image = bm
    46. End If
    47. End If
    48. End Sub
    49. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    50. Me.Invalidate()
    51. End Sub
    52. Private Sub SetBitmap()
    53. bm = Screenshot(0, 0, 0, 0, szBm.Width, szBm.Height)
    54. End Sub
    55. Private Function Screenshot(ByVal x0 As Integer, _
    56. ByVal y0 As Integer, _
    57. ByVal x1 As Integer, _
    58. ByVal y1 As Integer, _
    59. ByVal w As Integer, _
    60. ByVal h As Integer) As Bitmap
    61. Dim b As New Bitmap(w, h)
    62. Using g As Graphics = Graphics.FromImage(b)
    63. g.CopyFromScreen(x0, y0, x1, y1, New Size(w, h))
    64. End Using
    65. Return b
    66. End Function
    67. Public Sub New()
    68. MyBase.New()
    69. InitializeComponent()
    70. Me.Timer1.Enabled = False
    71. Me.Label1.Text = szBm.Width.ToString
    72. Me.Label2.Text = szBm.Height.ToString
    73. End Sub
    74. End Class


    Freundliche Grüsse

    exc-jdbi
    Dateien
    • FrmMain.zip

      (4,05 kB, 101 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    VB.NET-Quellcode

    1. Dim active As Boolean = False
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. If active Then
    4. Timer1.Stop()
    5. active = False
    6. Button1.Text = "Start"
    7. Else
    8. active = True
    9. Button1.Text = "Stop"
    10. Timer1.Start()
    11. End If
    12. End Sub
    13. Private Sub rotate()
    14. Dim b1 As Bitmap = Screenshot(1400, 50, 40, 100, 300, 550)
    15. b1.RotateFlip(RotateFlipType.Rotate180FlipNone)
    16. PictureBox1.Image = b1
    17. End Sub
    18. Function Screenshot(ByVal x0 As Integer, ByVal x1 As Integer, ByVal y0 As Integer, ByVal y1 As Integer, ByVal w As Integer, ByVal h As Integer) As Bitmap
    19. Dim b As New Bitmap(w, h)
    20. Dim g As Graphics = Graphics.FromImage(b)
    21. Me.Visible = False 'Form ausblenden für Screenshot
    22. g.CopyFromScreen(x0, y0, x1, y1, New Size(w, h))
    23. Me.Visible = True 'Form wieder einblenden
    24. g.Dispose()
    25. Return b
    26. End Function
    27. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    28. rotate()
    29. End Sub
    30. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    31. Me.Location = New Point(1400, 40) 'selbe Location wie der Ort an dem der Screenshot gemacht wird
    32. Me.TopMost = True
    33. End Sub


    Das Problem ist wie gesagt das Ausblenden der Form, um an den eigentlichen, dahinter liegenden Bildausschnitt zu kommen, um ihn darauf hin wieder rotiert einzublenden.

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

    Ich habs oben im Spoiler eingefügt. Einfach ein Beispiel für die 90° Drehung. Mit der Variable Counter (man könnte auch ein Booleean nehmen) kann dann gezielt erkennt werden, wie das Bild nun dargestellt werden soll.

    In deinem Fall wäre es also

    VB.NET-Quellcode

    1. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    2. If Me.Enabled Then
    3. Me.PictureBox1.Image = Nothing
    4. If bm IsNot Nothing Then
    5. Dim modi As Integer = counter Mod 2
    6. Select Case modi
    7. 'Case 0 : stop
    8. Case 1 : bm.RotateFlip(RotateFlipType.Rotate180FlipNone)
    9. End Select
    10. counter += 1
    11. Me.PictureBox1.Image = bm
    12. End If
    13. End If
    14. End Sub


    Freundliche Grüsse

    exc-jdbi
    Danke für die Arbeit, aber das eigentliche Problem wird ja damit nicht behandelt. Da die Form, die das Bild anzeigt genau dort liegen muss wo der Screenshot gemacht wird, wird der Screenshot immer wieder selbst gecapturet ohne das eigentliche Bild (z.B. ein laufendes Video live upzudaten. Ich habe es eben mit dem ein -bzw ausblenden der Form vor und nach dem Screenshot gelöst, was allerdings zu einem Flackereffekt führt, da jeweils nur jeder zweite Frame rotated ist.
    Ich denke das müsste man komplett ganz anders angehen. Mit einem FormScreenshot ist es bestimmt auch nicht gelöst. Im Moment fällt mir dazu auch nichts ein.

    Diese beiden Beispiele habe ich vor längerem mal angeschaut. Vielleicht hilft es dir
    Screen Capture1
    Screen Capture2

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    @DavidVB Wenn Du das Aufnehmen des ScreenShots mit der SDarstellung des ja|nein gedrehten Bildes synchronisierst, musst Du einfach beim Screenshot die Drehung rückgängig machen und die gewünschte Drehung realisieren.
    Ob das 60 Mal pro Sekunde stabil läuft, würde ich zunächst bezweifeln, fang an mit 1 Hz.
    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!