Drawing: Rechtecke + StretchDIBits



  • Hallo,

    ok, der Titel ist doof und triffts nicht ganz.

    Ich habe ein riesiges Bild (etwa 1600 x 1500 Pixel). Das Bild wird verkleinert gezeichnet (StretchDIBits).
    Jetzt möchte ich bestimmte Bereiche markieren. Soll heissen Rechteckte z.B. bei Position 13,14 oder 77,109 zeichnen.
    Dazu erzeuge ich ein HBITMAP und nutze Rectangle(...). Anschliessend zeichne ich das Bild mit StretchDIBits.

    Mein Problem: jetzt möchte ich z.B. die Rechtecke hervorheben, wenn sich die Maus darin befindet. Jedoch weiss ich nicht wie ich von den Koordinaten im verkleinerten Bild auf das orginal Bild bekomme. Ich weiss ja nicht was StretchDIBits aus dem Bild macht.

    Ich möchte nur auf Winapi und MFC zugreifen.

    Gibt es eine intelligentere Möglichkeit das Bild zu zeichnen? Oder was kann ich bei meiner Lösung hinzufügen / ändern?

    Das ganze sieht etwa so aus:

    HBITMAP bmp = CreateDIBSection(...); // 1600 x 1500
    CDC cbmp(bmp); 
    StretchDIBits(cbmp,0,0,1600,1500,0,0,1600,1500,...) // kopiere das Bild 1:1 in das HBITMAP
    Rectangle(cbmp,...);
    
    GetDIBits(cbmp,...,buffer,...); // kopiere Pixeldaten in buffer
    
    StretchDIBits(cPaintDC,...buffer,...); // zeichne Bild verkleinert in ein Control
    

    Es ist aus verschiedenen Gründen praktisch direkt mit den Pixeldaten und BITMAPINFO Strukturen zu arbeiten.

    Ok, hoffe das ist zumindest etwas verständlich 🙂



  • Mal anders gefragt: wie würdet ihr das machen?

    1. großes Bild (1600x1500) verkleinert in ein Control Zeichnen (Scrollbars sind nicht möglich)
    2. in das Bild Markierungen (Rechtecke) zeichnen
    3. Mouseover Effekt
    4. verschieben der Markierungen möglich

    1. + 2. sind kein Problem.
    3. + 4. sind problematisch, da das Bild nicht 1:1 gezeichnet wird und ich nicht weiss wie ich von Mauskoordinaten auf die tatsächlichen Bildkoordinaten komme.



  • Das musst du selber ausrechnen. Ist aber nicht soo kompliziert. Wenn das Aspektverhälniss gleich bleibt mußt du nur schauen welche Seite deines Bildes im Fenster komplett angezeigt wird und dann entsprechend aus dem Verhältniss Fensterbreite oder -höhe zu Orginalbreite/-höhe den Skalierungsfaktor berechnen. Wenn jetzt noch die linke obere Ecke des Bildes mit der linken oberen Ecke des Clientbereiches zusammen fällt kannst du alle Punkte durch Multiplikation mit dem Skalierungsfaktor umrechnen. Für CRect ist da die Methode MulDiv recht praktisch.


  • Mod

    Technisch lässt sich das direkt auch durch Änderungen das Mapping Modus und der Skalierung in MM_ANISOTROPIC erreichen.

    Dann hat man sofort logische und physikalische Koordinaten und kan nauch jedes beliebige Zpooming direkt implementieren.



  • Danke für die Antworten.
    MM_ANISOTROPIC scheint sehr interessant zu sein, und ist wohl genau das was ich suche.
    Ich bastel grad ein bissl dran rum. Mal schauen, obs klappt.


Anmelden zum Antworten