Announcement

Collapse
No announcement yet.

Canvas Problem , Hilfe gesucht ..

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Canvas Problem , Hilfe gesucht ..

    Um eine Bitmap pixelweise zu editieren setze ich auf einem
    stark vergrößerten Canvas den Befehl :

    Canvas.FloodFill(x,y,Canvas.pixels[x,y],fssurface)

    ein.

    Das funktioniert , aber wenn ein benachbarter Pixel die gleiche Farbe hat
    wird dieser natürlich auch ausgefüllt .
    Wie kann man das verhindern ?
    Ich habe vieles ausprobiert , finde aber keine Lösung .
    Kann da jemand helfen ?

    MfG
    Achim

  • #2
    Um eine Bitmap pixelweise zu editieren setze ich auf einem
    stark vergrößerten Canvas den Befehl :

    Canvas.FloodFill(x,y,Canvas.pixels[x,y],fssurface)

    ein.

    Das funktioniert , aber wenn ein benachbarter Pixel die gleiche Farbe hat
    wird dieser natürlich auch ausgefüllt .
    Wie kann man das verhindern ?
    Ich habe vieles ausprobiert , finde aber keine Lösung .
    Kann da jemand helfen ?

    MfG
    Achi

    Comment


    • #3
      Ich schlage vor den Canvas in der Originalgrösse zu lassen und nur vergrössert (mit Hilfe von SetWindowExtEx) zu zeichnen. Dann reicht ein Canvas.Pixels[x, y]:= clBlue

      Comment


      • #4
        Hallo Renê ,

        das habe ich schon probiert .
        Erstens besitzt TImage kein HDC und dann soll , so viel ich
        weiß , SetWindowExtEx NIL zurückgeben wenn ein bestimmter
        Anzeigemodus gesetzt ist .
        So genau kenne ich mich da nicht aus aber diese Funktion gibt mir immer
        NIL zurück .
        Wenn du das aber schon hinbekommen hast , bitte schreibe mir ein
        Beispielcode .

        MfG
        Achi

        Comment


        • #5
          Den Canvas bekommst du immer über das Canvas- und nicht über das Image-Objekt.

          Beispiel:

          hdcImage := Image1.Canvas.Handle

          Gruß, Bernhar

          Comment


          • #6
            Hallo,<br>hdcImage:=Image1.Picture.Bitmap.canvas.H andle ist glaube ich auch nicht schlecht.<br>:-) Jens Schuman

            Comment


            • #7
              Vielen Dank für die Info`s ,

              aber , Problem nicht erkannt - Problem noch nicht behoben .
              Der Canvas des TImage bleibt in der Original Größe , ich erzeuge einen
              externen Canvas .
              Alles was ich auf diesem Canvas ändere wird auch in der Bitmap des TImage
              geändert .
              Ich kann den externen Canvas nach belieben strecken und stauchen , alles
              kein Thema .
              Nur , auf dem neu gezeichneten Canvas werden die Pixel auch größer
              abgebildet und ein Canvas.pixels[x,y]:=clblue erzeugt bestenfalls einen
              Punkt , füllt aber nicht die Fläche die der Pixel jetzt hat .
              Jedes bessere Grafikprogramm kann auf einem gezoomten Bild editieren und
              genau so etwas suche ich .
              Vielleicht ist ein vergrößerter Canvas nicht der richtige Weg .
              Also , wie könnte man so etwas realisieren ?

              MfG
              Achi

              Comment


              • #8
                Hi

                Jedes bessere Grafikprogramm das so arbeitet wie Du sagt benutzt eine bestimmte Methode. Grundsätzlich nutzen diese immer eine Vergrößerung die immer einen Pixel auf 2,3,4,...x Pixel vergrößert. Damit wird bei einem Zoom von 2 aus JEDEM Pixel zwei in der vergrößerten Darstellung. Ein Zoom von 1.5 ist dagegen schlecht, da man dort keine exakten Pixelkoordinaten erhält. Der weitere Weg ist ja dann einfach, bei Zoom = 4, wird die relative Mausposition in der Vergrößerung durch 4 geteilt bzw. immer auf ein vielfaches von 4 ge"trunc"t, beim setzen eines virtuellen Pixels in der Vergrößerung wird dort ein 4x4 Pixel Rechteck auf die gleiche Farbe gesetzt.

                Gruß hage

                Comment


                • #9
                  Hallo Hagen ,

                  ich habe keine Probleme mit der Vergrößerung oder mit der Berechnung der
                  Koordinaten , das funktioniert bereits alles .
                  Nach der Vergrößerung erhalte ich ein Rechteck ( meinetwegen 4 x 4 ) .
                  Wenn ich die Maus über diese Rechtecke bewege , sollen diese ausgefüllt
                  werden und zwar ohne das angrenzende Rechtecke mit der gleichen Farbe
                  umgefärbt werden ( z.B. bei einfarbigen Flächen ) .

                  Canvas.Floodfill - Option FsSurface - ist unbrauchbar !
                  Canvas.Floodfill - Option FsBorder - damit kann man keine Linie zeichnen !

                  Muß ich jetzt jeden Pixel in dem Rechteck , in dem sich der Mauszeiger
                  befindet , berechnen und einzeln umfärben oder gibt es eine elegantere
                  Möglichkeit ?

                  Das , und nicht`s anderes , ist mein Problem :-) .

                  MfG
                  Achi

                  Comment


                  • #10
                    Hi Achim

                    nun, probiermal

                    Canvas.FillRect(Bounds(X, Y, 4, 4));

                    das füllt ein 4x4 Pixelrechteck an Position X,Y.

                    Gruß Hage

                    Comment


                    • #11
                      Hallo Hagen ,

                      vielen Dank für den Tipp .
                      Canvas.lineto mit pen.width 4 hat den gleichen Effekt , man kann quer
                      über den Canvas malen und es ist sehr schwierig eine grade Linie zu
                      zeichnen .
                      Aber das Problem habe ich inzischen auch im Griff . Ich kann jetzt
                      auf der x - oder y Achse exakte Linien malen , selbst größere Abweichungen
                      von der Anfangsposition werden ignoriert .
                      Und mit Fillrect(Bounds) geht das noch besser .
                      Es ist noch nicht die TOP Lösung , aber vorerst kann ich damit leben .

                      MfG
                      Achi

                      Comment

                      Working...
                      X