Bild aus PictureBox ausschneiden

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von tomtombusiness.

    Bild aus PictureBox ausschneiden

    Guten Tag
    Ich habe folgendes vor. Ich habe ein Bild in der PB1(PictureBox1) und davon möchte ich einen Teil ausschneiden. Die Position und Größe gebe ich per Schieberegler durch.
    Allerdings gibt's Probleme.

    Das Problem ist das die Positionen und Maße nicht vernünftig übernommen werden. Links unten das Original Bild und oben in der Mitte das Bild was ausgeschnitten werden soll.
    Man sieht trotz anpassen diverser Regler ändert sich nur die Breite.
    Aber irgendwie sollte des so auch nicht sein. Habe ich irgendwas falsch gemacht?

    VB.NET-Quellcode

    1. ​Imports System.Drawing.Imaging
    2. Imports System.Net
    3. Imports Vintasoft.Barcode
    4. Public Class LabelCreator
    5. Dim FullPic As Image = Nothing
    6. Dim HalfPic As Image = Nothing
    7. Dim selection As Rectangle
    8. Private Sub ChangePicture()
    9. If FullPic IsNot Nothing Then
    10. PictureBox1.Image = FullPic
    11. selection = New Rectangle(TrackBar1.Value, TrackBar2.Value, TrackBar4.Value, TrackBar3.Value)
    12. PictureBox2.Image = FullPic
    13. End If
    14. End Sub
    15. Private Sub LabelCreator_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    16. ListBox1.Items.Clear()
    17. With ListBox1.Items
    18. .Add("Onlineshop")
    19. .Add("DHL")
    20. .Add("Hermes")
    21. End With
    22. ListBox2.Items.Clear()
    23. End Sub
    24. Private Sub ListBox1_SelectedValueChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedValueChanged
    25. Select Case ListBox1.SelectedItem
    26. Case "DHL"
    27. ListBox2.Items.Clear()
    28. With ListBox2.Items
    29. .Add("Label abrufen (Manuell)")
    30. End With
    31. Case "Onlineshop"
    32. ListBox2.Items.Clear()
    33. With ListBox2.Items
    34. .Add("Amazon Retoure (gif)")
    35. End With
    36. End Select
    37. End Sub
    38. Private Sub ListBox2_SelectedValueChanged(sender As Object, e As EventArgs) Handles ListBox2.SelectedValueChanged
    39. Select Case ListBox2.SelectedItem
    40. Case "Label abrufen (Manuell)"
    41. Case "Amazon Retoure (gif)"
    42. Timer1.Enabled = True
    43. Timer1.Start()
    44. End Select
    45. '' ListBox1.Enabled = False
    46. ''ListBox2.Enabled = False
    47. End Sub
    48. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    49. Timer1.Stop()
    50. If My.Computer.Clipboard.ContainsImage Then
    51. Dim Res As MsgBoxResult = MessageBox.Show("Soll das Bild was sie eben in die zwicheablage kopiert haben, genutzt werden?", "Bild in der Zwichenablage nutzen?", MessageBoxButtons.YesNo)
    52. If Res = MsgBoxResult.Yes Then
    53. FullPic = (My.Computer.Clipboard.GetImage)
    54. My.Computer.Clipboard.Clear()
    55. PictureBox1.Image = FullPic
    56. TrackBar3.Maximum = FullPic.Height
    57. TrackBar4.Maximum = FullPic.Width
    58. End If
    59. End If
    60. Timer1.Start()
    61. End Sub
    62. Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles TrackBar1.Scroll
    63. ChangePicture()
    64. End Sub
    65. Private Sub TrackBar2_Scroll(sender As Object, e As EventArgs) Handles TrackBar2.Scroll
    66. ChangePicture()
    67. End Sub
    68. Private Sub TrackBar3_Scroll(sender As Object, e As EventArgs) Handles TrackBar3.Scroll
    69. ChangePicture()
    70. End Sub
    71. Private Sub TrackBar4_Scroll(sender As Object, e As EventArgs) Handles TrackBar4.Scroll
    72. ChangePicture()
    73. End Sub
    74. Private Sub PictureBox2_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox2.Paint
    75. If PictureBox2.Image IsNot Nothing Then
    76. Dim bmp As Bitmap = New Bitmap(PictureBox2.Image)
    77. Dim Rec As Rectangle = selection
    78. Dim Pformat As PixelFormat = bmp.PixelFormat
    79. Dim cloneBitmap As Bitmap = New Bitmap(TrackBar4.Value, TrackBar3.Value)
    80. cloneBitmap = bmp.Clone(Rec, Pformat)
    81. e.Graphics.DrawImage(cloneBitmap, 0, 0)
    82. 'Dim cl As Bitmap = New Bitmap(im, TrackBar4.Value, TrackBar3.Value)
    83. 'e.Graphics.DrawImage(im, 0, 0)
    84. End If
    85. End Sub
    86. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    87. PictureBox2.Refresh()
    88. End Sub
    89. End Class
    Bilder
    • Problemstellung.png

      25,04 kB, 620×566, 112 mal angesehen
    @tomtombusiness Kann es sein, dass das Bild in der PictureBox vergrößert / verkleinert dargestellt wird?
    Dann müsstest Du noch die Reglerwerte skalieren.
    Was soll das mit dem Timer?
    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!
    Spekulatius: Die PicBox oben mittig ist doch sicherlich auf Autosize gestellt, oder? Das wäre das Problem. Schalte es auf normal.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Der timer startet nach Auswahl der jeweiligen Funktion. Das Ganze ist nur ein Test Aufbau. Der timer checkt alle 1 Sekunden ob sich ein Bild im Zwichenspeicher Befindet.

    Die Picturebox steht nicht auf autosize. Das Problem ist das lediglich eine Art weißer block drüber gelegt wird. Allerdings lässt er sich nur in der breite bestimmen. Alle anderen angaben werden nicht übernommen.

    tomtombusiness schrieb:

    Die Picturebox steht nicht auf autosize
    Wie steht sie denn?
    Du kannst doch mit den NUD-Values ein Rechteck generieren und dies in Deine PictureBox als Overlay einzeichnen.
    Da weißt Du exakt, wo geschnitten wird.
    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!
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Die Picturebox ist glaube ich nicht das Problem. Ich habe dein Ratschlag befolgt und habe in der 1. Picture Box ein Rechteck Zeichnen lassen. Die Auswahl des zu kopierenden Bereich funktioniert Tadellos, aber irgendwo im Bereich von Original Bild Richtung neues Bild gibt es wohl ein Problem.

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

    tomtombusiness schrieb:

    ein Problem
    Wie genau äußert sich das?
    Kannst Du mal den relevanten Code posten?
    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!
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Der gesamte Code steht im ersten Beitrag. Probleme treten im Picturebox2 Paint Event auf. Und es macht sich so bemerkbar das in der ersten Picturebox(Original) das Rechteck dem ausgewählten Bereich entspricht, aber in der 2. Picturebox(Kopie) kein Bild angezeigt wird oder wenn halt eben nicht der gewünschte Bereich

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

    @tomtombusiness Dann häng mal das bereinigteProjekt (ohne bin, obj, vs-Verzeichnisse) als ZIP an und besachreib, was wir tun müssen, um Deinen Effekt zu reproduzieren.
    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!
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Ich habe jetzt den Code etwas angepasst.
    Es existiert nur dieses Fenster deswegen spare ich mir den Upload und sende euch den Originalen Code.

    Baut eine Win Form auf und knallt die Elemente wie auf dem Bild zu sehen dort rein.
    Die Listboxen füllen sich selber
    Die Schieberegler X und Y mit Minimalwert 1 und die Maximalwerte füllen sich auch selber
    Um ein Bild zu nutzen ladet es in den Zwichenspeicher. Rechtsklick Kopieren

    VB.NET-Quellcode

    1. Imports System.Drawing.Imaging
    2. Imports System.Net
    3. 'Imports Vintasoft.Barcode
    4. Public Class LabelCreator
    5. Dim FullPic As Image = Nothing
    6. Dim HalfPic As Image = Nothing
    7. Dim selection As Rectangle
    8. Private Sub ChangePicture()
    9. If FullPic IsNot Nothing Then
    10. PictureBox1.Image = FullPic
    11. selection = New Rectangle(TrackBar1.Value, TrackBar2.Value, TrackBar4.Value, TrackBar3.Value)
    12. PictureBox2.Image = FullPic
    13. TrackBar3.Maximum = TrackBar3.Maximum - TrackBar1.Value
    14. TrackBar4.Maximum = TrackBar4.Maximum - TrackBar2.Value
    15. End If
    16. End Sub
    17. Private Sub LabelCreator_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    18. ListBox1.Items.Clear()
    19. With ListBox1.Items
    20. .Add("Onlineshop")
    21. .Add("DHL")
    22. .Add("Hermes")
    23. End With
    24. ListBox2.Items.Clear()
    25. End Sub
    26. #Region "Auftragssteuerung"
    27. Private Sub ListBox1_SelectedValueChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedValueChanged
    28. Select Case ListBox1.SelectedItem
    29. Case "DHL"
    30. ListBox2.Items.Clear()
    31. With ListBox2.Items
    32. .Add("Label abrufen (Manuell)")
    33. End With
    34. Case "Onlineshop"
    35. ListBox2.Items.Clear()
    36. With ListBox2.Items
    37. .Add("Amazon Retoure (gif)")
    38. End With
    39. End Select
    40. End Sub
    41. Private Sub ListBox2_SelectedValueChanged(sender As Object, e As EventArgs) Handles ListBox2.SelectedValueChanged
    42. Select Case ListBox2.SelectedItem
    43. Case "Label abrufen (Manuell)"
    44. Case "Amazon Retoure (gif)"
    45. Timer1.Enabled = True
    46. Timer1.Start()
    47. End Select
    48. '' ListBox1.Enabled = False
    49. ''ListBox2.Enabled = False
    50. End Sub
    51. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    52. Timer1.Stop()
    53. If My.Computer.Clipboard.ContainsImage Then
    54. Dim Res As MsgBoxResult = MessageBox.Show("Soll das Bild was sie eben in die zwicheablage kopiert haben, genutzt werden?", "Bild in der Zwichenablage nutzen?", MessageBoxButtons.YesNo)
    55. If Res = MsgBoxResult.Yes Then
    56. FullPic = (My.Computer.Clipboard.GetImage)
    57. My.Computer.Clipboard.Clear()
    58. PictureBox1.Image = FullPic
    59. TrackBar3.Maximum = FullPic.HorizontalResolution
    60. TrackBar4.Maximum = FullPic.VerticalResolution
    61. End If
    62. End If
    63. Timer1.Start()
    64. End Sub
    65. #End Region
    66. #Region " Auschnittsteuerung"
    67. Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles TrackBar1.Scroll
    68. ChangePicture()
    69. End Sub
    70. Private Sub TrackBar2_Scroll(sender As Object, e As EventArgs) Handles TrackBar2.Scroll
    71. ChangePicture()
    72. End Sub
    73. Private Sub TrackBar3_Scroll(sender As Object, e As EventArgs) Handles TrackBar3.Scroll
    74. ChangePicture()
    75. End Sub
    76. Private Sub TrackBar4_Scroll(sender As Object, e As EventArgs) Handles TrackBar4.Scroll
    77. ChangePicture()
    78. End Sub
    79. #End Region
    80. Private Sub PictureBox2_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox2.Paint
    81. If PictureBox2.Image IsNot Nothing Then
    82. Dim bmp As Bitmap = New Bitmap(PictureBox2.Image)
    83. Dim Rec As Rectangle = selection
    84. Dim Pformat As PixelFormat = bmp.PixelFormat
    85. Dim cloneBitmap As Bitmap = New Bitmap(TrackBar4.Value, TrackBar3.Value)
    86. cloneBitmap = bmp.Clone(Rec, Pformat)
    87. e.Graphics.DrawImage(cloneBitmap, 0, 0)
    88. 'Dim cl As Bitmap = New Bitmap(im, TrackBar4.Value, TrackBar3.Value)
    89. 'e.Graphics.DrawImage(im, 0, 0)
    90. End If
    91. End Sub
    92. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    93. PictureBox2.Refresh()
    94. End Sub
    95. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    96. e.Graphics.DrawRectangle(New Pen(Color.Red, 2), selection)
    97. End Sub
    98. End Class

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

    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!
    @tomtombusiness
    Ich habe versuch den Code zum laufen zu bringen. Anbei das Ergebnis. Er ist nicht wirklich perfekt, aber mach was er soll.
    Dinge über die du noch Gedanken machen müsstest:
    - Fehlerprüfung
    - Welche Minimum- bzw Maximumwerte dürfen die TrackBars haben. (z.B. FullPic.HorizontalResolution <> Bildbreite, Bildbreite darf nie < 1 sein, usw.)
    - Braucht es den Timer, oder reicht es, wenn ListBox1.SelectedValueChanged das Bild aus der Zwischenablage holt.
    - usw.
    und wie RodFromGermany schon anmerkte (Visual Studio - Empfohlene Einstellungen)
    - Option Strict On
    - den Microsoft.VisualBasic-Namespace deaktiviern
    - den My-Namespace vermeiden (My.Computer.Clipboard wird zu System.Windows.Forms.Clipboard)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Imaging
    2. Imports System.Net
    3. 'Imports Vintasoft.Barcode
    4. Public Class LabelCreator
    5. Dim FullPic As Image = Nothing
    6. 'Dim HalfPic As Image = Nothing
    7. Dim selection As Rectangle
    8. Private Sub ChangePicture()
    9. If FullPic IsNot Nothing Then
    10. selection = New Rectangle(TrackBar1.Value, TrackBar2.Value, TrackBar4.Value, TrackBar3.Value)
    11. TrackBar3.Maximum = TrackBar1.Maximum - TrackBar1.Value
    12. TrackBar4.Maximum = TrackBar2.Maximum - TrackBar2.Value
    13. PictureBox1.Refresh()
    14. PictureBox2.Refresh()
    15. End If
    16. End Sub
    17. Private Sub LabelCreator_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    18. ListBox1.Items.Clear()
    19. With ListBox1.Items
    20. .Add("Onlineshop")
    21. .Add("DHL")
    22. .Add("Hermes")
    23. End With
    24. ListBox2.Items.Clear()
    25. End Sub
    26. #Region "Auftragssteuerung"
    27. Private Sub ListBox1_SelectedValueChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedValueChanged
    28. Select Case ListBox1.SelectedItem.ToString
    29. Case "DHL"
    30. ListBox2.Items.Clear()
    31. With ListBox2.Items
    32. .Add("Label abrufen (Manuell)")
    33. End With
    34. Case "Onlineshop"
    35. ListBox2.Items.Clear()
    36. With ListBox2.Items
    37. .Add("Amazon Retoure (gif)")
    38. End With
    39. Case Else
    40. End Select
    41. End Sub
    42. Private Sub ListBox2_SelectedValueChanged(sender As Object, e As EventArgs) Handles ListBox2.SelectedValueChanged
    43. If ListBox2.SelectedItem Is Nothing Then Exit Sub
    44. Select Case ListBox2.SelectedItem.ToString
    45. Case "Label abrufen (Manuell)"
    46. Timer1.Enabled = True
    47. Timer1.Start()
    48. Case "Amazon Retoure (gif)"
    49. Timer1.Enabled = True
    50. Timer1.Start()
    51. Case Else
    52. End Select
    53. '' ListBox1.Enabled = False
    54. ''ListBox2.Enabled = False
    55. End Sub
    56. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    57. Timer1.Stop()
    58. If Clipboard.ContainsImage Then
    59. Dim Res As DialogResult = MessageBox.Show("Soll das Bild was sie eben in die zwicheablage kopiert haben, genutzt werden?", "Bild in der Zwichenablage nutzen?", MessageBoxButtons.YesNo)
    60. If Res = DialogResult.Yes Then
    61. FullPic = Clipboard.GetImage
    62. 'My.Computer.Clipboard.Clear()
    63. PictureBox1.Image = FullPic
    64. TrackBar1.Maximum = CInt(FullPic.Height)
    65. TrackBar2.Maximum = CInt(FullPic.Width)
    66. TrackBar3.Maximum = CInt(FullPic.Height)
    67. TrackBar4.Maximum = CInt(FullPic.Width)
    68. TrackBar2.Value = 0
    69. TrackBar1.Value = 0
    70. TrackBar3.Value = TrackBar3.Maximum
    71. TrackBar4.Value = TrackBar4.Maximum
    72. End If
    73. End If
    74. 'Timer1.Start()
    75. End Sub
    76. #End Region
    77. #Region " Auschnittsteuerung"
    78. Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles TrackBar1.Scroll, TrackBar2.Scroll, TrackBar3.Scroll, TrackBar4.Scroll
    79. ChangePicture()
    80. End Sub
    81. #End Region
    82. Private Sub PictureBox2_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox2.Paint
    83. If FullPic IsNot Nothing Then
    84. Dim bmp As Bitmap = New Bitmap(FullPic)
    85. Dim Pformat As PixelFormat = bmp.PixelFormat
    86. Dim cloneBitmap As Bitmap = New Bitmap(selection.Height, selection.Width)
    87. cloneBitmap = bmp.Clone(selection, Pformat)
    88. PictureBox2.Image = cloneBitmap
    89. End If
    90. End Sub
    91. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    92. PictureBox1.Refresh()
    93. PictureBox2.Refresh()
    94. End Sub
    95. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    96. e.Graphics.DrawRectangle(New Pen(Color.Red, 2), selection)
    97. End Sub
    98. End Class