Programmatisch erzeugte Grafik kopieren/speichern

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Programmatisch erzeugte Grafik kopieren/speichern

    Ich habe eine, durch das Programm erzeugtes Grafik in einer Picturebox ( Entlehnt RodfromGermany´s: Oszilloskop - dynamische Darstellung beliebiger Kurven ).
    Es ist hinsichtlich der Eingangsdaten so modifiziert, dass es Messdaten über den USB einliest und dann grafisch darstellt. Soweit so gut.
    Jetzt soll das erhaltene Signal weiterverarbeitet werden (z.B. ausdrucken).
    Wie komme ich nun an die Daten hierfür (z.B. Bitmap). Dank der wunderbaren Menschen hier, glaube ich verstanden zu haben, dass sie jedenfalls nicht im Picturebox Control zu finden sind. So wie ein Bild im TV plötzlich weg ist, wenn man das Kabel vom Receiver abzieht (Oh Wunder), da es ja nicht im Fernseher steckt, sondern irgendwo im "Äther". OK. Das Pictureboxcontrol ist also nur ein Ausgabmedium ohne (?) eigenen Bildspeicher. .Image is also nich (oder genauer nothing) obwohl selbst das ungeübte Auge des Betrachters durchaus die bemerkenswerte Abbildung einer gedämpften Schwingung in der Picturebox wahrnehmen kann. Aber VB war ja wohl nie was, für Menschen, die die Dinge gerne etwas einfacher hätten.
    Wie aber komme ich - ohne schwerwiegende Hirnverrenkungen - an ein Abbild meines Signals?
    Performance ist nicht kritisch. Kann auch irgendwo zeilenweise Bits auslesen... Aber wo?
    Daaanke!

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

    Wenn Du es ausdrucken willst, kannst Du eigentlich die gleichen Methoden wie bei der PicBox verwenden. Im Paint-EventHandler arbeitest Du mit e.Graphics und wenn Du Dir ein PrintDocument auf's Form ziehst und ein Doppelklick drauf machst, kommst Du mein PrintPage-EventHandler raus, welches ebenfalls ein e.Graphics zur Verfügung stellt.
    Das Signal selbst besteht ja "nur" aus Messwerten. Wie Du die sonst noch weiterverarbeiten willst, musst Du schon konkretisieren. Eine Berechnung verläuft schließlich anders als eine Speicherung der Rohwerte in einer Datei oder das Ausdrucken einer Wertetabelle.
    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.
    Ja, ich hatte mir gedacht, dass ich da noch etwas hinzufügen müsste:
    Da es sich um eine Signalverarbeitung handelt, kann ich mit den Rohdaten nur bedingt etwas anfangen. Das Signal wird softwareseitig gefiltert, addiert usw.
    An dieser Stelle könnte ich zwar über den Handler ansetzen, müsste dann aber die Signalverarbeitung, das Overlay (Skalen, Hinweise, Werte usw.) nochmals oder parallel durchlaufen. Das ist theoretisch natürlich möglich, es gäbe dann praktisch einen "Zwillingsbruder" in einem anderen Control - aber und deswegen habe ich den Code hier erspart -das sind ein paar komplexe und verteilte Berechnungen mit etlichen geschachtelten Schleifen und Manipulationen und daher ist sowas immer fehleranfällig. Zudem sind diese Schritte hinsichtlich Performance schon jetzt ein wenig am Anschlag. Die Datenübertragung über den USB läuft nicht im Hintergrund oder asynchron und dauert ca. 2 Minuten. Das ist jetzt schon ein knappe Sache. Wenn ich da zu viel draufpacke, gibt es Stack Overflow. Würde ich gerne vermeiden. Zudem würde ich so ein Verfahren dann auch für andere Zwecke verwenden (Abspeichern usw.), sodass das dann evtl. mehrfach laufen müsste.
    (EDIT) Da ich oben über ausreichende Ressourcen berichtet habe: Das Signal wird eingelesen, on the fly mathematisch verarbeitet und mit Overlaydaten usw. bereichert und nach ca. 2 Minuten steht es dann still in der Picturebox.Ab dem Zeitpunkt ist alles idle und ich würde das angezeigte Bild gerne "abholen" (/EDIT)
    Im Prinzip hätte ich gerne eine Bitmap aus der Grafik, die ich ja am Bildschirm in der Picturebox sehen kann. Sowas wie ein Hexdump/Screenshot o.ä.
    Also entnehme ich deinem Vorschlag, dass WYSIWYG bei der Picturebox konzeptionell nicht vorgesehen ist und man da irgend einen Workaround basteln muss ?
    Bringt mich auf nen (Murks-) Gedanken: Google liefert bei "Screenshot from Control" etliche Treffer. Muss ich mal evaluieren.
    Gibt es denn da keine saubere und nicht-komplexe Route?

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

    MarcelBB schrieb:

    Gibt es denn da keine saubere und nicht-komplexe Route?
    Eine zusätzliche Routine ist nicht erforderlich - es ist also "sauberer" als du gedacht hast.
    Wie Vaporized schon sagte: Du kannst dieselbe Methode, mit der du das Bild in die Picturebox tust, auch benutzen, um es in eine Bitmap zu tun (wenn du das nicht eh schon tust).
    Die Bitmap kann man speichern.
    Kommt jetzt also auf deine Methode an, mit der du das Bild in die Picturebox bringst: Ist die nicht sauber, dann gibts eben (noch) keine saubere Methode.
    Vielleicht gibts eine Möglichkeit, die Methode sauber zu machen - aber ohne sie zu sehen können wir nicht sinnvoll beraten.
    Was mir zu später Stunde in den ermüdeten (Un)Sinn kam:

    VB.NET-Quellcode

    1. Private Sub BtnSavePicBoxImage_Click(sender As Object, e As EventArgs) Handles BtnSavePicBoxImage.Click 'Abspeichern auf Knopfdruck
    2. Using Image As New Bitmap(PictureBox1.Width, PictureBox1.Height)
    3. Dim Graphics = Drawing.Graphics.FromImage(Image)
    4. DrawPicBoxContent(Graphics)
    5. Image.Save("D:\1.png", Imaging.ImageFormat.Png)
    6. End Using
    7. End Sub
    8. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint 'Darstellung zur Laufzeit
    9. DrawPicBoxContent(e.Graphics)
    10. End Sub
    11. Private Shared Sub DrawPicBoxContent(Graphics As Graphics)
    12. Graphics.DrawLine(Pens.Orange, 0, 0, 10, 10) 'oder wasauchimmer gezeichnet werden soll …
    13. End Sub

    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.
    Versteh es natürlich nicht ganz, da ich dachte man könne nicht profan den Inhalt einer Picturebox abspeichern, wenn Image nothing ist. Aber wenn so ginge wäre es ja toll.
    Habe das aber mal gebaut und bekomme Fehler:BC30506: die Handles Klausel erfordert eine Withevents Variable....

    @ErfinderDesRades: Basiert wie oben geschrieben auf dem Code von RodvonGermany..... Ich versuche es mal etwas kompakter ohne Berechnungssubs hier:

    VB.NET-Quellcode

    1. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint, Label42.Paint
    2. ' Darstellungsbedingungen abtesten
    3. If Me.points1 Is Nothing OrElse Me.points1.Count < 20 Then
    4. Return
    5. End If
    6. ' Instanzen bereitstellen
    7. Dim g1 As GraphicsPath = New GraphicsPath
    8. Dim g2 As GraphicsPath = New GraphicsPath
    9. Dim g3 As GraphicsPath = New GraphicsPath ' Einheitenanzeige
    10. Dim Testpath As GraphicsPath = New GraphicsPath ' Testpfad um skalierung zu ermitteln
    11. For index = 0 To MetalValue.Length - 2
    12. MetallCoords(index) = New GraphicsPath
    13. Next
    14. ' Pfade mit Daten für Volt und VaV befüllen
    15. g1.AddLines(Me.points1.ToArray)
    16. g2.AddLines(Me.points2.ToArray)
    17. For index = 0 To MetalName.Length - 2
    18. Dim X As Single = 0
    19. Dim Y As Single = (MetalValue(index).Y * -1) '
    20. Dim StartPoint As New PointF(X, Y)
    21. MetallCoords(index).AddString(MetalName(index), family, FontStyle, CSng(10), StartPoint, Format)
    22. Next
    23. ' Um-Rechteck von Volt und VaV bestimmen
    24. Dim rc1 = g1.GetBounds()
    25. Dim rc2 = g2.GetBounds()
    26. rc1.Y = rc1.Y
    27. rc2.Y = rc2.Y
    28. Dim rc = RectangleF.Union(rc1, rc2) ' das größere von beiden
    29. ' Kurven auf Darstellungsbereich skalieren
    30. g1.Warp(Me.GetPointsFromRect(), rc)
    31. g2.Warp(Me.GetPointsFromRect(), rc)
    32. g3.Warp(Me.GetPointsFromRect(), rc)
    33. ' Arrays mit Graphicpfaden skalieren
    34. For index = 0 To MetalName.Length - 2
    35. Me.MetallCoords(index).Warp(Me.GetPointsFromRect(), rc) 'skalieren
    36. Next
    37. ' Volt, VaV, Metallname darstellen
    38. Dim VoltPen As New Pen(My.Settings.MyCustomPenColor2, 2)
    39. Dim VaVPen As New Pen(My.Settings.MyCustomPenColor3, 2)
    40. e.Graphics.DrawPath(VoltPen, g1) ' Volt
    41. e.Graphics.DrawPath(VaVPen, g2) ' VaV
    42. For index = 0 To MetalName.Length - 2 ' Metall Namen
    43. Dim y2 = Me.MetallCoords(index).GetLastPoint.Y
    44. e.Graphics.DrawString(Me.MetalName(index), DrawFont(FontNumber), Brushes.Orange, PictureBox1.Width - 100 - index * 30, y2 - DrawFont(FontNumber).GetHeight, Format) ' ShiftNames * index + 60
    45. Next
    46. For index = 0 To Units.Length - 2 ' Skala
    47. Dim Scale As New PointF(0, CSng(index * -100)) ' Testskalierung
    48. Testpath.Reset()
    49. Testpath.AddLine(Scale, Scale)
    50. Testpath.Warp(Me.GetPointsFromRect, rc) ' Testpfad
    51. Dim Scalefactor = Testpath.PathPoints(0).Y '-
    52. Dim Value As Integer = index * 100
    53. Dim StartPoint As PointF
    54. StartPoint = New PointF(0, Scalefactor)
    55. Dim EndPoint As PointF
    56. EndPoint = New PointF(5, Scalefactor)
    57. Dim EndPointStrg As PointF
    58. EndPointStrg = New PointF(5, Scalefactor - DrawFont(FontNumber).SizeInPoints / 2) ' Korrektur von abweichender Stringkoordinatendarstellung (Ecke oben links)
    59. Me.Units(index) = StartPoint ' Startpunkt
    60. Me.Units(index) = EndPoint ' Endpunkt
    61. CustomPenColor.Color = My.Settings.MyCustomPenColor1
    62. CustomPenColor.Width = 2
    63. e.Graphics.DrawLine(CustomPenColor, StartPoint, EndPoint)
    64. StartPoint.X = CSng(PictureBox1.Width)
    65. EndPoint.X = CSng(PictureBox1.Width - 10)
    66. e.Graphics.DrawLine(CustomPenColor, StartPoint, EndPoint)
    67. Dim BrushColor = New SolidBrush(My.Settings.MyCustomBrushColor1)
    68. e.Graphics.DrawString(Value.ToString, DrawFont(FontNumber), BrushColor, EndPointStrg)
    69. EndPointStrg.X = CSng(PictureBox1.Width - 70)
    70. e.Graphics.DrawString(Value.ToString, DrawFont(FontNumber), BrushColor, EndPointStrg)
    71. Next
    72. End Sub
    73. Public Function DisplayCurve(y1 As Integer, y2 As Integer) As Object
    74. ' die Zeit-Koordinate
    75. Dim t = Me.coord / 10
    76. ' Y Koordinaten umkehren
    77. y1 *= -1
    78. y2 *= -1
    79. Me.points1.Add(New PointF(Convert.ToSingle(t), Convert.ToSingle(y1)))
    80. Me.points2.Add(New PointF(Convert.ToSingle(t), Convert.ToSingle(y2)))
    81. ' Bildbreite festlegen
    82. If Me.points1.Count > NumberOfTupels Then ' Mehr als NumberofTupels Daten? Anfang löschen
    83. Me.points1.RemoveAt(0)
    84. Me.points2.RemoveAt(0)
    85. End If
    86. ' nächste Koordinate
    87. Me.coord += 1
    88. End Function
    89. Private Function GetPointsFromRect() As PointF()
    90. Dim sz = Me.PictureBox1.Size
    91. ' 3 Rechteck-Punkte in ein Point-Array konvertieren
    92. ' (- 1): Rectangle-Effekt berücksichtigen
    93. Return New PointF() {New PointF(0, 0), New PointF(sz.Width - 1, 0), New PointF(0, sz.Height - 1)}
    94. End Function


    CodeTags korrigiert ~VaporiZed

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

    MarcelBB schrieb:

    bekomme Fehler:BC30506: die Handles Klausel erfordert eine Withevents Variable
    :huh:
    Das ist jetzt aber ein Grundlagenfehler. Du kannst nicht einfach meinen Code kopieren. Der funktioniert natürlich nur dann, wenn Du auch eine PicBox namens PictureBox1 hast. Sonst meckert der Compiler, weil er sich denkt: "Ich kann das Paint-Event von PictureBox1 nicht verarbeiten, denn ich kenne keine PictureBox1."
    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.

    MarcelBB schrieb:

    auf dem Code von RodvonGermany
    Der Kollege heißt RodFromGermany :!:
    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!

    MarcelBB schrieb:

    Allerdings ist die shared sub da irgendwie ein Hindernis...
    Das versteh ich inhaltlich nicht. Und bzgl. der von Dir genannten Fehlermeldung: Bevor ich da lange spekulationiere: Lad mal bitte einen Screenshot des Codes mit Anzeige der Fehlermeldung hoch, also sowas:
    Bilder
    • ErrorExample.png

      4,14 kB, 951×95, 90 mal angesehen
    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.

    MarcelBB schrieb:

    Bekäme man denn aus deinem Skript einen "Screenshot" des Signals aus der Picturebox heraus?
    Willst Du das in der PictureBox dargestellte Bild als Datei speichern oder in die Zwischenablage kopieren?
    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!
    @RodFromGermany: Ich will das Messergebnis letztlich auch speichern können, aber zunächst nur im Messprotokoll (das dann ausgedruckt wird) einfügen.

    @VaporiZed: Das muss ein ganz dämlicher Fehler sein, den ich da gemacht habe . 1 Form, 1 Button und 1e picturebox - was kann ich da falsch gemacht haben? ;( Nennt mich Noob of the year. ich finds nicht.
    Bilder
    • Sandbox1.png

      141,31 kB, 1.524×1.042, 92 mal angesehen
    • Sandbox2.png

      85,67 kB, 1.564×1.023, 87 mal angesehen
    Definiere

    MarcelBB schrieb:

    das Messergebnis
    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!
    @MarcelBB Hat doch @VaporiZed in Post #5 beschrieben.
    Du hast meine Frage noch nicht beantwortet:

    RodFromGermany schrieb:

    Willst Du das in der PictureBox dargestellte Bild als Datei speichern oder in die Zwischenablage kopieren?
    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!

    MarcelBB schrieb:

    Als Datei speichern.
    Und was meinst Du zu Post #5?
    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!
    Autsch :S . Was ich in Post#7 schrieb, gilt natürlich auch für den Button. Wenn Dein Button nicht BtnSavePicBoxImage heißt, kannst Du auch nicht schreiben Handles BtnSavePicBoxImage. Der Compiler weiß ja dann eben nicht, auf welchen Button er reagieren soll. BtnSavePicBoxImage kennt er ja nicht. Also benenn Deinen einen Button im Designer so um, dass er BtnSavePicBoxImage heißt und dann ist erstmal dieser Fehler beseitigt.
    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.
    @VaporiZed: OK, habe ich korrigiert. Wäre ja auch zu einfach gewesen wenn die Fehlermeldung "There is no such control..." gelautet hätte... Mein Versagen ok. Vielen Dank!
    @RodFromGermany
    Das Ganze funktioniert dann auch in diesem Rahmen wunderbar. Aber sobald ich das auf mein Programm anwende und die Using Schleife am Anfang und Ende der Sub einfüge, die die Messwerte in eine Kurve zusammenfügt, speichert er nur noch ein leeres Image ohne jeglichen grafischen Inhalt. Also jedenfalls nicht mehr das, was zu diesem Zeitpunkt in der Picturebox zu sehen ist.

    EDIT: Allerdings habe ich die Sub in der gezeichnet wird nicht als shared gekennzeichnet. Sobald ich das tue, gibt es massiv Fehler, da die dort verwendeten Variablen usw. wohl nicht zur Verfügung stehen. Ist evtl. das shared ausschlaggebend? Was mache ich dann mit den ganzen Zugriffen auf Variablen usw. die dort nicht zulässig sind?

    VB.NET-Quellcode

    1. Sub ReceiveFileData()
    2. Using Image As New Bitmap(PictureBox1.Width, PictureBox1.Height)
    3. Dim Graphics = Drawing.Graphics.FromImage(Image)
    4. LogMsg.Add(DateTime.Now & ": Trying to revceive data from " & Port & vbCrLf)
    5. UpdateLogFile(LogMsg.Item(LogMsg.Count - 1))
    6. UpdateTimer()
    7. '*******************************************************
    8. Dim Incoming As String = Data3 'Data2(counter)
    9. If Incoming Is Nothing Then
    10. LogMsg.Add(DateTime.Now & ": Receiving no data" & vbCrLf)
    11. UpdateLogFile(LogMsg.Item(LogMsg.Count - 1))
    12. ResetValues()
    13. Exit Sub
    14. End If
    15. Dim VoltStrg = Incoming.Split(Chr(10))
    16. For index = 0 To VoltStrg.Length - 1
    17. Replace(VoltStrg(index), ChrW(10), "")
    18. Next
    19. VoltOffset = CInt(NumericUpDown1.Value)
    20. For index = 0 To CInt(VoltStrg.Count / 2) - 2
    21. Dim Y = VoltStrg(index).Split(Chr(44)) ' Nach Komma auftrennen
    22. Y(0) = Replace(Y(0), Chr(44), "") ' Komma löschen
    23. 'Y(1) = Replace(Y(1), Chr(44), "") ' Komma löschen (falls vorhanden)
    24. Data1 = Data1 & Y(0) & "," & Y(1) & vbLf
    25. Dim Y1 = CInt(Y(0)) + VoltOffset ' Volt
    26. Dim Y2 = CInt(Y(1)) + VoltOffset ' VaV
    27. VaV.Add(Y2) ' Long Vav
    28. CompareMetals()
    29. If Y1 < Vmin Then
    30. Vmin = Y1
    31. Label11.Text = Vmin.ToString
    32. End If
    33. If Y1 > VMax Then
    34. VMax = Y1
    35. Label12.Text = VMax.ToString
    36. End If
    37. Y1 = CheckZoom(Y1, Y2)
    38. '***********************************
    39. '***********************************************************************
    40. SamplesTotal = SamplesTotal + 1
    41. Label40.Text = SamplesTotal.ToString
    42. '************************************************************************
    43. DisplayCurve(Y1, Y2)
    44. DisplayValues(Y2.ToString)
    45. Me.PictureBox1.Refresh()
    46. Next
    47. LogMsg.Add(DateTime.Now & ": No more data coming. Waiting... " & vbCrLf)
    48. UpdateLogFile(LogMsg.Item(LogMsg.Count - 1))
    49. LogMsg.Add(DateTime.Now & ": Number of expected samples: " & NumberofSamples & vbCrLf)
    50. UpdateLogFile(LogMsg.Item(LogMsg.Count - 1))
    51. '****************************************** Ende der Grafikausgabe !**********************************
    52. SaveFileDialog1.ShowDialog()
    53. Dim Path = SaveFileDialog1.FileName
    54. Image.Save(Path, Imaging.ImageFormat.Png)
    55. End Using
    56. ProgressBar1.Value = 0
    57. ProgressBar1.Update()
    58. LogMsg.Add(DateTime.Now & ": END " & vbCrLf)
    59. UpdateLogFile(LogMsg.Item(LogMsg.Count - 1))
    60. If Calibrate = True Then
    61. CheckCalibration()
    62. End If
    63. coord = 0
    64. points1.Clear()
    65. points2.Clear()
    66. End Sub


    CodeTags korrigiert ~VaporiZed

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

    Vergiss das Shared. Das ging bei mir, weil ich keine Klassenvariablen meines Forms nutzte. Du nutzt welche, daher darf es nicht Shared sein.
    Du machst viel zu viel in Deiner Sub. Malen, Loggen, Dateinamen vom User holen, Controls ändern, Daten speichern und sonstewasalles. Wenn das alles von einem Paint-EventHandler aufgerufen wird, dann gnade Dir Bill Gates. Zwischen Using Image und End Using gehört nur das Malen und Speichern, sonst gar nix. Keine Dateiauswahl, keine Controländerung. Es beeinflusst vielleicht nicht das Programm, aber das Verständnis, wenn das da alles reingestopft wird. Mal doch erstmal nur das Bild und versuch es mit vorgegebenen Angaben zu speichern. Das ist ein 5-Zeiler. Wenn das nicht klappt, dann können wir drüber reden, was genau nicht klappt.
    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.