ZoomPanel, zurück zu Vollbild funktioniert nicht

  • C#
  • .NET (FX) 4.0

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    ZoomPanel, zurück zu Vollbild funktioniert nicht

    Moin Leute,
    Ziel ist es, mono Kamerabilder (~ 4000x3000 Pixel, 8 BPP) live darzustellen, zu zoomen, in der Zoomdarstellung zu scrollen und bei Zoomwechsel die Bildmitte zu erhalten.
    Statt der Kamera habe ich zwei entsprechend große 8-BPP-Bitmaps (sehr groß!) eingefügt, das Livebild wird über einen Timer realisiert.
    Zoom 0 bedeutet, dass das Bild im SizeMode = Zoom als Vollbild dargestellt wird.
    Zoom 1-3 bedeutet, dass das Bild 1x1, 2x2, 3x3 Bildpixel pro Kamerapixel dargestellt wird. Das jeweilig gezoomte Bild wird berechnet und angezeigt.
    Die Anzeige erfolgt in einer eigenen PictureBox-Klasse, die in einem scrollable Panel eingebettet ist,.
    Alles funktioniert gut, so lange nicht in einer Zoomstufe gescdrollt und dann Zoom auf 0 gestellt wird.
    Hier wird das Bild irgendwo außerhalb des Scrollbereiches dargestellt, und es ist mir noch nicht gelungen, dies wieder einzufangen.
    Als Arbeits-Drumherum wird der Zoom-Dialog geschlossen und wieder erstellt.
    Die zentrale Routine ist DlgCameraLive.CreateZoomImage().
    Es wäre schön, wenn jemand findet, woran ich noch nicht gedacht habe.
    =======
    Zum Nachvollziehen fügt zwei (unterschiedliche) gleichgroße Mono-Bilder ein.
    Dateien
    • TestZoom.zip

      (22,42 kB, 149 mal heruntergeladen, zuletzt: )
    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!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ () aus folgendem Grund: Ich habe die riesigen Bilder aus dem Projekt rausgenommen.

    Habs gefunden:
    pbImage.Dock muss bei Zoom = 0 auf .Fill, sonst auf .None gesetzt werden.
    Außerdem muss die Reihenfolge beim (um-)setzen der Properties beachtet werden.
    Hier die korrigierte Routine CreateZoomImage():
    Spoiler anzeigen

    C#-Quellcode

    1. /// <summary>
    2. /// Das Kamerabild wird entsprechend der Zoomstufe
    3. /// in ImageView skaliert und dargestellt
    4. /// </summary>
    5. private void CreateZoomImage()
    6. {
    7. if (this.ImageOriginal == null)
    8. {
    9. return;
    10. }
    11. if (this.ImageView != null)
    12. {
    13. this.ImageView.Dispose();
    14. }
    15. // Übergroßes Bild
    16. if (this.nudZoom.Value > 1)
    17. {
    18. try
    19. {
    20. // hier wird ggf. ein überdimensionales Bild erzeugt!!!
    21. // hier kam beim Ubuntu-W7-Rechner eine OutOfMemory-Exception
    22. Bitmap bmp = DlgCameraLive.CreateZoomImage(this.ImageOriginal, (int)this.nudZoom.Value);
    23. this.ImageView = bmp;
    24. if (bmp == null)
    25. {
    26. Console.Out.WriteLine("Out Of Memory, set Zoom Value to minimum");
    27. this.nudZoom.Value = this.nudZoom.Minimum;
    28. return;
    29. }
    30. }
    31. catch
    32. {
    33. // OutOfMemoryException, ApplicationException
    34. //Console.Out.WriteLine(ex.Message);
    35. Console.Out.WriteLine("OutOfMemoryException, set Zoom Value to 0");
    36. this.nudZoom.Value = this.nudZoom.Minimum;
    37. return;
    38. }
    39. }
    40. else
    41. {
    42. // Zoom = 0 - Darstellung des Bildes im Control
    43. // Zoom = 1 - 1 Kamera-Pixel = 1 Bildpixel
    44. this.ImageView = (Bitmap)this.ImageOriginal.Clone();
    45. }
    46. this.ImageView.Palette = this.ImageOriginal.Palette;
    47. this.pbImage.Zoom = (int)this.nudZoom.Value;
    48. if (this.nudZoom.Value == 0)
    49. {
    50. this.pbImage.SetImage(this.ImageView);
    51. this.pbImage.Dock = DockStyle.Fill;
    52. this.pnImage.AutoScroll = false;
    53. this.pbImage.SizeMode = PictureBoxSizeMode.Zoom;
    54. }
    55. else
    56. {
    57. this.pbImage.Dock = DockStyle.None;
    58. this.pbImage.SetImage(this.ImageView);
    59. // Scrollbars aktivieren
    60. this.pnImage.AutoScroll = true;
    61. this.pbImage.SizeMode = PictureBoxSizeMode.AutoSize;
    62. this.pbImage.Size = this.ImageView.Size;
    63. }
    64. this.pbImage.Update();
    65. if (this.DoChangeScroll)
    66. {
    67. this.ChangeScrollProperties();
    68. }
    69. }
    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!