Picturebox zoomen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von SystemUnknow.

    Picturebox zoomen

    Hi,

    So wie ich es gelesen habe, geht eine Zoom-Funktion bei der Picturebox durch ein Panel im Hintergrund und meistens durch das vergrößern der Picturebox, oder es wird ein Bereich ausgeschnitten.
    Dies ist jedoch kein wirklicher Zoom, ist es möglich eine Zoom-Funktion zu schreiben, welche wie das Zoomen in dem Bildbetrachter von Windows 7 funktioniert?
    Sprich es zoom in das Bild hinein. Wer den Bildbetracher kennt, wird den Unterschied zwischen dem Zoom und den oben genannten "Lösungen" kennen.

    Ich hatte bisher weder über die Boardsuche noch über Google etwas passendes finden können. Die meisten Antworten bezogen sich auf das vergrößern der Picturebox, die anderen verwiesen auf C# Sources die lediglich Ausschnitte tätigten und dazu noch nicht ganz fehlerfrei waren.

    Wie dem auch sei, falls jemand eine Lösung weiß oder weiß das es nicht möglich ist, wäre ich über eine Antwort sehr verbunden.

    Gruß,
    Hatschi
    ich würde das bild zoomen, also den ausschnitt ausschneiden den du brauchst und dann diesen ausschnitt von der picturebox zoomen lassen aber ich weiss nicht wie das geht... hab mal gegoogelt vielleicht hilft dir das weiter:
    klick mich

    OS: Linux Peppermint & Windows 7
    Processor: AMD Phenom II X6 1055T @ 3.5 GHz
    RAM: 8 GB Kingston ValueRAM
    GFX: NVIDIA GeForce 210

    ErfinderDesRades schrieb:

    Hatschi schrieb:

    Wer den Bildbetracher kennt, wird den Unterschied zwischen dem Zoom und den oben genannten "Lösungen" kennen.

    kenne ich aber nicht. Kannst du mal beschreiben, was du meinst?


    Klar kann ich das, ich versuche es zumindest^^

    Man scrollt mit dem Mausrad und es wird im Gegensatz zur VB Lösung auf die Mitte des Bildes gezoomt (bzw. dort wo der Mauszeiger sich befindet), sprich das Bild vergrößert sich, bleibt aber zentriert.
    Bei der VB Lösung verschwindet das Bild ja rechts/unten, bei Windows 7 "scrollt" man quasi auf die Fläche unterhalb des Mauszeiger zu.
    Der erste Link scheint interessant zu sein, leider entstehen viele Überlappungen, so dass es im Endeffekt funktioniert aber leider optisch unter aller Sau ist.

    Meine Ideen waren bisher das Bild temporär zu vergrößern, das Problem wäre dabei den Fokus auf die Fläche unterhalb des Mauszeigers zu legen.
    Ne andere Idee war ein Ausschnitt der Fläche unterhalb des Mauszeigers zu tätigen und diesen in der Picturebox anzeigen zu lassen, doch das gibt Probleme wenn die Bildgröße variiert.

    Im Prinzip soll das Bild lediglich vergrößert werden (nicht die Picturebox, eine Scrollbar ist nicht nötig) und dabei soll der Fokus auf der Fläche unterhalb des Mauszeigers liegen.
    Ich weiß aber nicht wie es in der Theorie angehen soll mit dem Fokus.
    Ich habe jetzt dieses

    VB.NET-Quellcode

    1. Public Property Scrollpos() As PointF
    2. 'unglaubliches Fehldesign an ScrollableControl.AutoScrollPosition: der Getter returnt die
    3. '! Inversion des Setters!
    4. Get
    5. With MyBase.AutoScrollPosition
    6. Return New PointF(-.X, -.Y)
    7. End With
    8. End Get
    9. Set(ByVal Value As PointF)
    10. If AssignSave(MyBase.AutoScrollPosition, Value.Round) Then
    11. If _Zoom > 1 Then Invalidate()
    12. End If
    13. End Set
    14. End Property
    15. Private Sub SetupAutoScroll()
    16. MyBase.AutoScrollMinSize = _Bitmap.Size.Mult(_Zoom).Round
    17. MyBase.Invalidate()
    18. End Sub

    ersetzt durch:

    VB.NET-Quellcode

    1. Public Scrollpos As PointF
    2. Private Sub SetupAutoScroll()
    3. 'MyBase.AutoScrollMinSize = _Bitmap.Size.Mult(_Zoom).Round
    4. MyBase.Invalidate()
    5. End Sub
    Jetzt kann man im Bild nicht mehr navigieren, aber zoomt weiterhin auf die Bildmitte.
    Zum Probieren ein sehr großes Bild öffnen.

    Ist interessant: Fürs Flackern ists Setzen der AutoScrollMinSize verantwortlich, und ohne dieses kann man halt nicht gescheit navigieren im Bild.

    Aber du hast mich auf die Idee gebracht, 2 Modi einzuführen: Zoom-Modus und Navigations-Modus.
    In den Navi-Modus könnteman beim PicViewer immer geschaltet sein, wenn die Picbox selbst den Focus bekommt.

    Das machichma - dauert ein paar Stunden
    Ich habe jetzt folgenden Code gefunden, der gescheit funktionert.

    codeproject.com/KB/miscctrl/Picture_Viewer.aspx

    Das Problem: es gibt keinen SizeMode mehr, da keine Picturebox benutzt wird.
    Was relativ schade ist da ich das Bild gerne an die Fenstergröße anpassen wollte (SizeMode.Zoom).

    //Edit: rein theoretisch bräuchte ich die Class NetViewer als Toolbox Item Picturebox, nur mit Inherits klappt es dann auch nicht mehr.

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

    Naja, mir hatte es nicht geholfen, dadurch das es keine Picturebox war.
    Habe jetzt eine Alternative gefunden, die ist zwar weder perfekt, noch das was ich wollte. Aber sie ist a) eine Picturebox und b) ermöglicht das Zoomen ohne größere Bugs.