png problem

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

  • png problem

    diese frage wurde sicher schon 1000mal gestellt

    sorry aber hab hier nicht wirklich was gefunden

    ich erzeuge ein png mit php das scheint auch zu klappen nur die anzeige des bildes ist binär



    ich hab im header :

    PHP-Code:
        <meta http-equiv="content-type" content="image/png;"/> 
    aufrufen tu ich das bild mit :
    PHP-Code:
    print '($myimg)'
    und erstellt wird es mit :

    PHP-Code:
    class gd_gradient_fill {
        
        
    // Constructor. Creates, fills and returns an image
        
    function gd_gradient_fill($w,$h,$d,$s,$e,$step=0) {
            
    $this->width $w;
            
    $this->height $h;
            
    $this->direction $d;
            
    $this->startcolor $s;
            
    $this->endcolor $e;
            
    $this->step intval(abs($step));

            
    // Attempt to create a blank image in true colors, or a new palette based image if this fails
            
    if (function_exists('imagecreatetruecolor')) {
                
    $this->image imagecreatetruecolor($this->width,$this->height);
            } elseif (
    function_exists('imagecreate')) {
                
    $this->image imagecreate($this->width,$this->height);
            } else {
                die(
    'Unable to create an image');
            }
            
            
    // Fill it
            
    $this->fill($this->image,$this->direction,$this->startcolor,$this->endcolor);
            
            
    // Show it        
            
    $this->display($this->image);
            
            
    // Return it
            
    return $this->image;
        }
        
        
        
    // Displays the image with a portable function that works with any file type
        // depending on your server software configuration
        
    function display ($im) {
            if (
    function_exists("imagepng")) {
                
    header("Content-type: image/png");
                
    imagepng($im);
            }
            elseif (
    function_exists("imagegif")) {
                
    header("Content-type: image/gif");
                
    imagegif($im);
            }
            elseif (
    function_exists("imagejpeg")) {
                
    header("Content-type: image/jpeg");
                
    imagejpeg($im""0.5);
            }
            elseif (
    function_exists("imagewbmp")) {
                
    header("Content-type: image/vnd.wap.wbmp");
                
    imagewbmp($im);
            } else {
                die(
    "Doh ! No graphical functions on this server ?");
            }
            return 
    true;
        }
        
        
        
    // The main function that draws the gradient
        
    function fill($im,$direction,$start,$end) {
            
            switch(
    $direction) {
                case 
    'horizontal':
                    
    $line_numbers imagesx($im);
                    
    $line_width imagesy($im);
                    list(
    $r1,$g1,$b1) = $this->hex2rgb($start);
                    list(
    $r2,$g2,$b2) = $this->hex2rgb($end);
                    break;
                case 
    'vertical':
                    
    $line_numbers imagesy($im);
                    
    $line_width imagesx($im);
                    list(
    $r1,$g1,$b1) = $this->hex2rgb($start);
                    list(
    $r2,$g2,$b2) = $this->hex2rgb($end);
                    break;
                case 
    'ellipse':
                    
    $width imagesx($im);
                    
    $height imagesy($im);
                    
    $rh=$height>$width?1:$width/$height;
                    
    $rw=$width>$height?1:$height/$width;
                    
    $line_numbers min($width,$height);
                    
    $center_x $width/2;
                    
    $center_y $height/2;
                    list(
    $r1,$g1,$b1) = $this->hex2rgb($end);
                    list(
    $r2,$g2,$b2) = $this->hex2rgb($start);
                    
    imagefill($im00imagecolorallocate$im$r1$g1$b1 ));
                    break;
                case 
    'ellipse2':
                    
    $width imagesx($im);
                    
    $height imagesy($im);
                    
    $rh=$height>$width?1:$width/$height;
                    
    $rw=$width>$height?1:$height/$width;
                    
    $line_numbers sqrt(pow($width,2)+pow($height,2));
                    
    $center_x $width/2;
                    
    $center_y $height/2;
                    list(
    $r1,$g1,$b1) = $this->hex2rgb($end);
                    list(
    $r2,$g2,$b2) = $this->hex2rgb($start);
                    break;
                case 
    'circle':
                    
    $width imagesx($im);
                    
    $height imagesy($im);
                    
    $line_numbers sqrt(pow($width,2)+pow($height,2));
                    
    $center_x $width/2;
                    
    $center_y $height/2;
                    
    $rh $rw 1;
                    list(
    $r1,$g1,$b1) = $this->hex2rgb($end);
                    list(
    $r2,$g2,$b2) = $this->hex2rgb($start);
                    break;
                case 
    'circle2':
                    
    $width imagesx($im);
                    
    $height imagesy($im);
                    
    $line_numbers min($width,$height);
                    
    $center_x $width/2;
                    
    $center_y $height/2;
                    
    $rh $rw 1;
                    list(
    $r1,$g1,$b1) = $this->hex2rgb($end);
                    list(
    $r2,$g2,$b2) = $this->hex2rgb($start);
                    
    imagefill($im00imagecolorallocate$im$r1$g1$b1 ));
                    break;
                case 
    'square':
                case 
    'rectangle':
                    
    $width imagesx($im);
                    
    $height imagesy($im);
                    
    $line_numbers max($width,$height)/2;
                    list(
    $r1,$g1,$b1) = $this->hex2rgb($end);
                    list(
    $r2,$g2,$b2) = $this->hex2rgb($start);
                    break;
                case 
    'diamond':
                    list(
    $r1,$g1,$b1) = $this->hex2rgb($end);
                    list(
    $r2,$g2,$b2) = $this->hex2rgb($start);
                    
    $width imagesx($im);
                    
    $height imagesy($im);
                    
    $rh=$height>$width?1:$width/$height;
                    
    $rw=$width>$height?1:$height/$width;
                    
    $line_numbers min($width,$height);
                    break;
                default:
            }
            
            for ( 
    $i 0$i $line_numbers$i=$i+1+$this->step ) {
                
    // old values :
                
    $old_r=$r;
                
    $old_g=$g;
                
    $old_b=$b;
                
    // new values :
                
    $r = ( $r2 $r1 != ) ? intval$r1 + ( $r2 $r1 ) * ( $i $line_numbers ) ): $r1;
                
    $g = ( $g2 $g1 != ) ? intval$g1 + ( $g2 $g1 ) * ( $i $line_numbers ) ): $g1;
                
    $b = ( $b2 $b1 != ) ? intval$b1 + ( $b2 $b1 ) * ( $i $line_numbers ) ): $b1;
                
    // if new values are really new ones, allocate a new color, otherwise reuse previous color.
                // There's a "feature" in imagecolorallocate that makes this function
                // always returns '-1' after 255 colors have been allocated in an image that was created with
                // imagecreate (everything works fine with imagecreatetruecolor)
                
    if ( "$old_r,$old_g,$old_b!= "$r,$g,$b"
                    
    $fill imagecolorallocate$im$r$g$b );
                switch(
    $direction) {
                    case 
    'vertical':
                        
    imagefilledrectangle($im0$i$line_width$i+$this->step$fill);
                        break;
                    case 
    'horizontal':
                        
    imagefilledrectangle$im$i0$i+$this->step$line_width$fill );
                        break;
                    case 
    'ellipse':
                    case 
    'ellipse2':
                    case 
    'circle':
                    case 
    'circle2':
                        
    imagefilledellipse ($im,$center_x$center_y, ($line_numbers-$i)*$rh, ($line_numbers-$i)*$rw,$fill);
                        break;
                    case 
    'square':
                    case 
    'rectangle':
                        
    imagefilledrectangle ($im,$i*$width/$height,$i*$height/$width,$width-($i*$width/$height), $height-($i*$height/$width),$fill);
                        break;
                    case 
    'diamond':
                        
    imagefilledpolygon($im, array (
                            
    $width/2$i*$rw-0.5*$height,
                            
    $i*$rh-0.5*$width$height/2,
                            
    $width/2,1.5*$height-$i*$rw,
                            
    1.5*$width-$i*$rh$height/), 4$fill);
                        break;
                    default:    
                }        
            }
        }
        
        
    // #ff00ff -> array(255,0,255) or #f0f -> array(255,0,255)
        
    function hex2rgb($color) {
            
    $color str_replace('#','',$color);
            
    $s strlen($color) / 3;
            
    $rgb[]=hexdec(str_repeat(substr($color,0,$s),2/$s));
            
    $rgb[]=hexdec(str_repeat(substr($color,$s,$s),2/$s));
            
    $rgb[]=hexdec(str_repeat(substr($color,2*$s,$s),2/$s));
            return 
    $rgb;
        }
    }
    ?> 
    Angehängte Dateien

  • #2
    Dir ist aber schon klar, dass du Bild und Markup über ein img-Tag mit src-Attribut voneinander trennen musst*?

    * Inline-Images werden ja leider nicht komplett unterstützt.

    Kommentar


    • #3
      Re: png problem

      Original geschrieben von crussader
      diese frage wurde sicher schon 1000mal gestellt

      sorry aber hab hier nicht wirklich was gefunden
      /
      Dazu muss man auch nichts "finden", sondern mal kurz logisch nachdenken.

      Wie bindest du denn normalerweise ein Bild in ein HTML-Dokument ein, wenn PHP gar nicht im Spiel ist?

      Kopierst du da etwa die binaeren Daten aus der Bilddatei in das HTML-Dokument hinein? Nein? Wie kommst du dann auf die Idee, dass das ploetzlich sinnvoll sein koennte, nur weil die Bilddaten nicht in einer statischen Datei vorliegen, sondern per PHP erzeugt werden?


      Die Antwort lautet also: Binde das Bild ganz genau so ein, als ob es statisch waere. Ein Client interessiert sich ueberhaupt nicht dafuer, ob eine Ressource auf dem Server statisch aus einer Datei erstellt, dynamisch von PHP erzeugt, oder von deiner Oma gestrickt wird. Also mache bei der clientseitigen Einbindung auch keinerlei Unterschied.
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        Die Content-Type-Angabe macht den darunterstehenden PNG-Code kaputt. Es muß heißen:
        header("Content-type: image/png");

        Kommentar


        • #5
          wenn ich das nun alles so richtig verstanden habe muss ich das bild mit

          PHP-Code:
          <?
          require_once('gd-gradient-fill.php');
          $myimg = new gd_gradient_fill(80,20,'diamond','#ff0010','#303060');
          ?>

          <img src="<? echo'$myimg'?>">
          einbinden ?

          klappt nicht
          hab als aufruf noch
          PHP-Code:
          <?
          require_once('gd-gradient-fill.php');
          $myimg = new gd_gradient_fill(80,20,'diamond','#ff0010','#303060');
          ?>
          <? header("Content-type: image/png");?>
          <body>
          <? echo '<img src="'.$myimg.'">' ?>
          </body>
          versuch - ohne erfolg
          es klappt nur wenn ich z.b. das bild vorher speicher
          wie hier:
          PHP-Code:
          <?php 
          // Beispiel für ein simples Bild
          header("Content-type: image/png"); // Mime-Type setzen
          $im     imagecreate(155,155); // Erstellt ein rechteckiges 
                                         // Bild mit 155 Pixel Kantenlänge
          $background_color ImageColorAllocate ($im255255255);
                                 
          // erste Farbe ist Hintergrundfarbe
          $blue imagecolorallocate($im0128255); // Blau
          $red =  imagecolorallocate($im255,0,0);  // Rot
          $yellow imagecolorallocate($im255,255,0); // Gelb
          // drei gefüllte Rechtecke
          imagefilledrectangle $im55100,100,$red);
          imagefilledrectangle $im7575150,150,$blue);
          imagefilledrectangle $im8520140,160,$yellow);
          $speichern '00'.'.png';
          imagepng($im,$speichern); // Das Bild als PNG-Bild ausgeben
          imagedestroy($im); // Alle Resourcen, die wegen des Bildes gehalten werden, freigeben.
          echo '<img src="'.$speichern.'">'
          ?>
          nur leider bekomm ich das in der anderen php nicht hin das das bild gespeichert wird.
          hab in die funktion
          display($im) versucht abzuändern :

          PHP-Code:
              function display ($im) {
                  if (
          function_exists("imagepng")) {
                      
          header("Content-type: image/png");
          $speichern 'test'.'.png';
          imagepng($im,$speichern); // Das Bild als PNG-Bild ausgeben
          imagedestroy($im); // Alle Resourcen, die wegen des Bildes gehalten werden, freigeben.
                  

          nur leider bleibt der bildschirm weiss
          ich glaub mir fehlt die logic
          Zuletzt geändert von crussader; 31.01.2009, 05:58.

          Kommentar


          • #6
            Na, dann guck mal was passiert, wenn du imagepng einen zweiten Parameter übergibst: http://de.php.net/imagepng
            [FONT="Helvetica"]twitter.com/unset[/FONT]

            Shitstorm Podcast – Wöchentliches Auskotzen

            Kommentar


            • #7
              moinsen

              nunja ich hab ja als 2. parameter $speichern übergeben - und in $speichern steht der dateiname : $speichern = '00'.'.png';

              nur leider funktioniert das nur in dem beispiel mit den 3 rechtecken und in anderen beispielbildern.

              wenn ich die gd_gradient_fill.php so abändere :
              PHP-Code:
                  // depending on your server software configuration
                  
              function display ($im) {
                      if (
              function_exists("imagepng")) {
                          
              header("Content-type: image/png");
              $speichern 'test'.'.png';
              imagepng($im,$speichern); // Das Bild als PNG-Bild ausgeben
              imagedestroy($im); // Alle Resourcen, die wegen des Bildes gehalten werden, freigeben.
                      

              passiert nüx

              Kommentar


              • #8
                Was interessiert mich, was du als 2. Parameter übergibst? Ich habe dich auf was vollkommen anderes hingewiesen! Und dein Code ist identisch zu dem vorherigen.
                [FONT="Helvetica"]twitter.com/unset[/FONT]

                Shitstorm Podcast – Wöchentliches Auskotzen

                Kommentar


                • #9
                  also irgendwie verstehe ich dich nicht

                  erst sagst du :

                  unset Na, dann guck mal was passiert, wenn du imagepng einen zweiten Parameter übergibst: http://de.php.net/imagepng
                  und dann sag ich dir das der 2. parameter der dateiname ist .

                  jetzt sagst du :

                  unset Was interessiert mich, was du als 2. Parameter übergibst? Ich habe dich auf was vollkommen anderes hingewiesen! Und dein Code ist identisch zu dem vorherigen.
                  und als parameter finde ich hier :

                  $image
                  $filename
                  $quality
                  $filters

                  das bedeutet für mich
                  imagepng($image, $filename) damit ich die ausgabe von $image in eine datei schreiben kann - ist das so richtig ?

                  und wenn das passiert ist $imagedestroy($image) damit beim nächsten aufruf der seite das bild neu geladen werden kann

                  Kommentar


                  • #10
                    Du sollst dem Link folgen und überprüfen, wie sich imagepng verhält, wenn du zusätzlich einen zweiten Parameter übergibst, dass in Beziehung zu deinem Problem setzen, dass das Bild nicht ausgegeben wird und dir so selbst helfen.

                    Verständlicher?
                    [FONT="Helvetica"]twitter.com/unset[/FONT]

                    Shitstorm Podcast – Wöchentliches Auskotzen

                    Kommentar


                    • #11
                      Original geschrieben von crussader
                      wenn ich das nun alles so richtig verstanden habe muss ich das bild mit [...] einbinden ?

                      klappt nicht
                      hab als aufruf noch [...] versuch - ohne erfolg
                      Da hast du immer noch binaere Bilddaten und HTML-Code innerhalb ein und der selben Ressource an den Browser ausgeliefert - dabei wurdest du bereits darauf hingewiesen, dass du das doch auch nicht so machst, wenn du ein statisches Bild einbindest. Also warum nimmst du an, dass das bei einem dynamischen Bild irgendwie sinnvoll sein koennte?

                      es klappt nur wenn ich z.b. das bild vorher speicher
                      Dann mach dir klar, was daran der Unterschied zu obigem Vorgehen ist.

                      Na?

                      Richtig, damit hast du zwei voneinander unabhaengige Ressourcen, die der Browser einzeln anfordert - einmal das HTML-Dokument, in dem der Browser <img src="..."> findet, und daraufhin stellt er eine zweite Anforderung an den Server, mit der bei ... angegebenen Adresse, und fordert damit das Bild separat an.

                      Das "zum Beispiel" ist das wichtige in deiner obigen Aussage. Wenn du es erst speicherst, dann hast du letztendlich wieder ein statisches Bild, dass du anschliessend irgendwo einbinden kannst.
                      Du musst es aber natuerlich nicht speichern, du kannst das Script die Bilddaten auch dynamisch ausgeben lassen - aber bitte so, dass dies mit einem zweiten, von der HTML-Seite vollkommen unabhaengigen Request passiert.
                      I don't believe in rebirth. Actually, I never did in my whole lives.

                      Kommentar


                      • #12
                        also ist mein problem nicht der code mit dem das bild erstellt wird sondern wie ich es aufrufe ?

                        gruss c.

                        Kommentar


                        • #13
                          Ja (wenn wir "Aufrufen" zwecks etwas korrekterer Formulierung mal durch "Einbinden" ersetzen).
                          I don't believe in rebirth. Actually, I never did in my whole lives.

                          Kommentar


                          • #14
                            na da bin ich ja schonmal bissi schlauer

                            ich hab eine datei erstellt - bild.php

                            der inhalt :

                            PHP-Code:
                            <?
                            require_once('gd-gradient-fill.php');
                            $myimg = new gd_gradient_fill(80,20,'diamond','#ff0010','#303060');
                            //$img = new gd_gradient_fill(400,200,'ellipse','#f00','#000',0);

                            echo '<img src="'.$myimg.'">'
                            ?>
                            so müsste das doch dann eigentlich richtig sein

                            Kommentar


                            • #15
                              okokok - hab das ; hinter dem aufruf vergessen

                              SCHANDE ÜBER MICH

                              aber nu geht das - komisch ich dachte das hätt ich schon so versucht

                              Kommentar

                              Lädt...
                              X