imagearc() und Linienstärken

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • imagearc() und Linienstärken

    Hallo...

    Ich habe da gerade einige Problemchen mit der Funktion "imagearc()" und Linienstärken. Zum einen wäre da der Umstand, das zuvor mit "imagesetthickness()" gesetzte Linienstärken bei Vollkreisen bzw. Vollellipsen komplett ignoriert werden. Das umgehe ich, indem ich zwei Halbkreise zeichne. Das jedoch gravierendere Problem ist, das bei dicker werdenden Linienstärken nun an der äusseren Kante seltsame Einkerbungen (ob nun Kreisbogen oder Vollkreis) entstehen (Rote Markierungen im Bild). Die Einkerbungen werden bei stärkeren Linien immer grösser. Hat dafür jemand 'ne Lösung?



    cu Charles Monroe
    Zuletzt geändert von Charles Monroe; 15.06.2008, 01:18.

  • #2
    Also für Leute, bei denen das Problem bisher noch nicht aufgetreten ist, wird es schwierig dir zu helfen. Da sollte schon mindestens ein kurzer Test-Code her.

    Kommentar


    • #3
      Da... Bitteschön... Der Code...
      Die Dimensionen sind so gross, weil die Grafik mit 600 DPI gerändert werden soll, und ca. 25mm x 25mm gross ist.
      PHP-Code:
      <?php
      $img 
      imagecreatetruecolor(600600);
      imagesavealpha($imgtrue);
      imagealphablending($imgfalse);
      imageantialias($imgfasle);
      $cl imagecolorallocatealpha($img255255255127);
      $bg imagecolorallocate($img255255255);
      $fg imagecolorallocate($img000);
      imagefilledrectangle($img00600600$cl);
      imagefilledarc($img3003006006000360$bgnull);
      imagesetthickness($img50);
      imagearc($img3003005505500180$fg);
      imagearc($img300300550550180360$fg);
      header("content-type: image/png");
      imagepng($img);
      ?>
      cu Charles Monroe
      Zuletzt geändert von Charles Monroe; 15.06.2008, 16:38.

      Kommentar


      • #4
        Puh, also mein Ergebnis sieht noch deutlich schlimmer aus, als deine verkleinerte Version.

        Allerdings scheint es mit imagesetthickness() nicht besser zu gehen.
        EDIT:
        ist wohl auch ein bekannter bug


        Du könntest mal versuchen mehrere (dünne)Kreise ineinander zu setzen, so dass Sie einen großen Kreis ergeben.
        Oder zwei gefüllte Kreise übereinander: ImageFilledEllipse
        Zuletzt geändert von TobiaZ; 15.06.2008, 16:58.

        Kommentar


        • #5
          Imagearc benutzt einen Algorythmus bei dem zuerst waagrecht und dann senkrecht Pixel aufgefüllt werden... scheint da nicht ganz zu klappen . Ich weiss nicht genau woran es liegt, aber ich werde es mir mal noch genauer anschauen. Wie Tobiaz gesagt hast verwendest du am besten 2x imagefilledellipse. Das ist das schnellste und du erhältst damit auch die schönsten Kreise.

          Kommentar


          • #6
            Ok... 2x 'imagefilledelipse()' klingt gut.
            Allerdings (Irgendwas is' immer)... Die Reihenfolge, in welcher der Kreis und der Text gerändert werden ist nicht fest. Wie bekomme ich es denn nun damit hin, ohne den Text zu übermalen?

            hier könnt ihr euch mal anschauen, wofür es benötigt wird.

            cu Charles Monroe
            Zuletzt geändert von Charles Monroe; 15.06.2008, 17:36.

            Kommentar


            • #7
              Allerdings (Irgendwas is' immer)... Die Reihenfolge, in welcher der Kreis und der Text gerändert werden ist nicht fest.
              Warum nicht?
              Wie bekomme ich es denn nun damit hin, ohne den Text zu übermalen?
              Wie hast du es denn bei deiner vorherigen Variante hinbekommen?

              Kommentar


              • #8
                Original geschrieben von TobiaZ
                Wie hast du es denn bei deiner vorherigen Variante hinbekommen?
                Diese Frage verstehe ich nicht. "imagearc()" übermalt den inneren Teil des Kreises doch gar nicht. "imagefilledarc()" dagegen schon.

                cu Charles Monroe

                Kommentar


                • #9
                  Diese Frage verstehe ich nicht. "imagearc()" übermalt den inneren Teil des Kreises doch gar nicht.
                  Sorry, mein Fehler. Ich hatte irgendwie im Kopf, dass du den text auf den Kreis druckst, nicht darein.

                  Naja, entweder musst du die Reihenfolge im Programm festlegen. Das sollte theoretisch möglich sein. Wie du da vorgehen musst, kann ich dir aber als Außenstehender nicht sagen.

                  Alternativ könntest du mal versuchen ob du den Inhalt des Kreises nachträglich transparent bestimmen kannst. Und ob dann der darunterliegende Text zum Vorschein kommt.

                  Kommentar


                  • #10
                    Das hat unheimlich geholfen!!! Mit anderen Worten es klappt. Etwa so...

                    PHP-Code:
                    <?php
                    $img 
                    imagecreatetruecolor(600600);
                    imagesavealpha($imgtrue);
                    imagealphablending($imgtrue);
                    imageantialias($imgfasle);
                    $cl imagecolorallocatealpha($img255255255127);
                    $bg imagecolorallocate($img255255255);
                    $fg imagecolorallocate($img000);
                    imagefilledrectangle($img00600600$cl);
                    imagefilledarc($img3003006006000360$bgnull);
                    newimagearc($img3003006006000360$fg50);
                    header("content-type: image/png");
                    imagepng($img);

                    function 
                    newimagearc(&$img$cx$cy$w$h$s 0$e 360$c$strength 1)
                    {
                      
                    $cx round($cx $w 2);
                      
                    $cy round($cy $h 2);
                      
                    $dx round($w 2);
                      
                    $dy round($h 2);
                      
                    $tmp imagecreatetruecolor($w$h);
                      
                    imagealphablending($tmpfalse);
                      
                    $tr imagecolorallocatealpha($tmp255255255127);
                      
                    imagefilledrectangle($tmp00$w$h$tr);
                      
                    imagefilledarc($tmp$dx$dy$w$h$s$e$cnull);
                      
                    imagefilledarc($tmp$dx$dy$w $strength 2$h $strength 2$s$e$trnull);
                      
                    imagealphablending($imgtrue);
                      
                    imagecopy($img$tmp$cx$cy00$w$h);
                    }
                    ?>
                    Danke vielmals.

                    cu Charles Monroe

                    @edit: Ok... kleiner Irrtum. Mal geht's... (GD 2.0.34) und mal nicht... (GD 2.0.28)
                    Zuletzt geändert von Charles Monroe; 18.06.2008, 19:18.

                    Kommentar


                    • #11
                      Was willst du mit deiner Funktion genau bezwecken?
                      Warum nicht einfach so:
                      PHP-Code:
                      <?php
                      $img 
                      imagecreatetruecolor(600600);
                      imagesavealpha($imgtrue);
                      imagealphablending($imgtrue);
                      imageantialias($imgfasle);
                      $bg imagecolorallocate($img255255255);
                      $fg imagecolorallocate($img000);
                      imagefill($img00$bg);
                      imagefilledellipse($img300300550550$fg);
                      imagefilledellipse($img300300500500$bg);
                      header("content-type: image/png");
                      imagepng($img);
                      ?>

                      Kommentar


                      • #12
                        Original geschrieben von jmc
                        Was willst du mit deiner Funktion genau bezwecken?
                        Wurde schon (mehr oder weniger konkret) erwähnt. Das innere des Kreises soll Transparent sein und nicht eben Weis(s?). "newimagearc()" funktioniert prächtig ab GD 2.0.34 mit Freetype 2.1.9. Bei dem Server wo es laufen soll (siehe Link weiter oben) mit GD 2.0.28 und Freetype 2.1.3 will es aber nicht.

                        cu Charles Monroe

                        @edit: Ich hab' nochma 'n bisserl rumprobiert. Nun scheints auch bei GD 2.0.28 zu funzen. Nochmals danke.
                        Zuletzt geändert von Charles Monroe; 15.06.2008, 22:13.

                        Kommentar


                        • #13
                          Das macht hier aber algemein nicht so viel Sinn denke ich. Die Schrift bringst du da ja trotzdem rein. Und wenn du die Transparenz dieses Bereiches schon brauchst kannst du das auch einfacher machen. Z.B. so:
                          PHP-Code:
                          <?php
                          $img 
                          imagecreatetruecolor(600600);
                          imagesavealpha($imgtrue);
                          imageantialias($imgfasle);
                          $cl imagecolorallocatealpha($img255255255127);
                          $bg imagecolorallocate($img255255255);
                          $fg imagecolorallocate($img000);
                          imagefill($img00$bg);
                          imagefilledellipse($img300300550550$fg);
                          imagealphablending($imgfalse);
                          imagefilledellipse($img300300500500$cl);
                          imagealphablending($imgtrue);
                          header("content-type: image/png");
                          imagepng($img);
                          ?>

                          Kommentar


                          • #14
                            Original geschrieben von jmc
                            Die Schrift bringst du da ja trotzdem rein
                            Nicht ganz... Die Schrift könnte unter Umständen schon da sein. Der Code ist oben ist nur ein Bruchteil von dem Ergebnis, welches über den Link darunter zu betrachten ist. Das soll ein Stempel-Designer werden, welcher auf Element-Basis arbeitet. D.h. man kann erstmal einen Text (Textkreis) )erstellen und anschliessend einen Rahmen (Kreis) herum zeichnen. Übrigens kann die Funktion nun auch von anderen (kopieren/einfügen) verwendet werden, da sie auf diese Art "imagearc()" komplett ersetzt. Vielleicht sollte man noch die Strichstärke notfalls auf 1 setzen sowie Start- und Endwinkel initialisieren. Ich ändere das mal.

                            cu Charles Monroe
                            Zuletzt geändert von Charles Monroe; 18.06.2008, 19:20.

                            Kommentar


                            • #15
                              Auch dann kannst du ja ohne weiteres dieses Bild als Hintergrund nehmen und den Rest darauf kopieren. Oder umgekehrt, ob die Schrift schon da ist oder nicht spielt keine Rolle...

                              Kommentar

                              Lädt...
                              X