Ankündigung

Einklappen
Keine Ankündigung bisher.

imagejpeg ausgabe funkt nicht

Einklappen

Neue Werbung 2019

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

  • imagejpeg ausgabe funkt nicht

    hallo habe dieses phpskript zur erstellung eines bildausschnittes und dessen ausgabe, aber was mir ausgegeben wird sind hyroglyphen. kann mir bitte jemand weiter helfen, finde nicht den fehler und auch keine anhaltspunkte im netz.
    hier mein skript und meine ausgabe:

    PHP-Code:
    <?php
    header
    ("Content-type: image/jpeg");
    // Aufruf der Funktion: 
    erzeugeBildausschnitt("test.jpg"); 

    function 
    erzeugeBildausschnitt($bildQuelle){
        
    // welche Breite + Hoehe soll der Ausschnitt haben
        
    $Ausschnitt_Breite 85;
        
    $Ausschnitt_Hoehe 85;
        
        
    // welcher Bereich soll dargestellt werden
        
    $Position_x 0
        
    $Position_y 0;
        
        
    $img1 imagecreatefromjpeg($bildQuelle);//OriginalDatei
        
    $img2 imagecreatetruecolor($Ausschnitt_Breite$Ausschnitt_Hoehe);//Neue Datei mit Auschnitt der Originaldatei
        
        //Was soll geschehen?
        //Aus der Hauptdatei soll ein Auschnitt (x: 15px; y:15 px; Breite: 70px; Höhe: 140px)
        //in die Neue Dateu ($img2) kopiert werden.
        
    imagecopymerge($img2$img100$Position_x$Position_y$Ausschnitt_Breite$Ausschnitt_Hoehe100);
        
        
    //Die neue Datei wird unter einem anderen Namen abgespeichert (und anschließend Speicher gelöscht)
        
        
    imagejpeg($img2);
        
    imagedestroy($img1);
        
    imagedestroy($img2);

    }
    ?>
    Code:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <title>Unbenanntes Dokument</title>
    </head>
    
    <body>
    
    ÿØÿà�JFIF������ÿþ�>CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality
    ÿÛ�C�		
    
     $.' ",#(7),01444'9=82<.342ÿÛ�C			
    [..]
    :D}zšÙ�úƤyfâºÍ%&˜¢”«zÊŠ›¢Jwj(«hbÓZ(©´gŠ( cªK47`c8 E*ï	ŽT“‘ô'—6?×·ëþ4Q]-c,ÊØûCÑE$¬]ÿÙ
    </body>
    
    </html>
    wäre dankbar, wenn mir jemmand eine kleine hilfe geben könnnte. danke


    Edit by Zergling: Binärcode gekürzt, zerschießt sonst die Breite der Seite, bitte in Zukunft selbst darauf achten.


  • #2
    Hallo, das Problem ist offensichtlich:
    Du mischt HTML-Code und JPEG-Binärcode. Das funktioniert so nicht. Ein Bild
    musst du in HTML immernoch mit dem <img>-Tag einbinden.

    Das heißt jetzt für dich, du musst die Erzeugung des JPEGs in eine eigene
    Datei auslagern. Dazu musst du (wie du es bereits tust) den richtigen header
    senden und mit imagejpeg() ausgeben. In dieser Datei darf aber kein HTML
    vorkommen.

    Speicher also den obigen Code ab in der Datei "create-jpg.php".
    In deinem HTML-Code kannst du nun die Datei einbinden:
    Code:
    [img]create-jpg.php[/img]

    Kommentar


    • #3
      danke super, jetzt funktioniert es einwandfrei.

      Kommentar


      • #4
        habe das ganze jetzt noch ein wenig erweitert und wollte mir jetzt aus allen bildern die in meiner datenbank sind immer 11 per random ausgeben lassen. ich bekomme aber nur 11 schwarze bilder. kann es sein das der bildpfad nicht weitergegeben wird? und wie kann ich diesen weitergeben? hier mein code:

        PHP-Code:
        <?php
        include ("php/referenzen/settings.php");
        include (
        "php/referenzen/mysql_tabels.php");

        include (
        "php/mysql_connect.php");

        $db_connect mysql_connect ($dbhost$dbuser$dbpass);
        $db_select mysql_select_db ($dbname);

        $max_pictures_string "SELECT * FROM $picture_list WHERE status='1'";
        $db_max_pictures mysql_query ($max_pictures_string,$db_connect);
        $bilderanzahl mysql_num_rows ($db_max_pictures);

        ?>
        <?php 
        if ($_GET['page'] != "bilder"){
        ?>
        <div id="gallery_unten">

        <?php
        if ($bilderanzahl>0) {
        // Vorschaubilder anzeigen
        if ($bilderanzahl<11) {
        $maxbilder=$bilderanzahl;
        }
        if (
        $bilderanzahl>11) {
        $maxbilder=11;
        }
        $pictures_string "SELECT * FROM $picture_list WHERE status='1' ORDER BY RAND() LIMIT 11";
        $db_pictures mysql_query ($pictures_string,$db_connect);
        for (
        $j=0;$j<$maxbilder;$j++) {   
                    
        $daten mysql_fetch_array ($db_pictures,MYSQL_BOTH);                               
                    
        // Beginn der Bildertabelle
                    
        $datei_bytes=filesize("php/referenzen/".$daten[gallery_ordner]."/img/$daten[picture_name]");
                    
        $datei_kbytes=round(($datei_bytes/1024),0);
                     echo 
        "<div id=\"bild_gallery\"><a href=\"main.php?page=bilder&ordner=$daten[gallery_ordner]\">"
                     if (
        file_exists ("php/referenzen/".$daten[gallery_ordner]."/thumbs/$daten[picture_name]") && $daten[picture_name] != "") {
                     echo 
        "[img]create_jpg.php[/img]</a>";
                     }
                     else {
                     echo 
        "[img]images/no_thumb.gif[/img]</a>";
                     }
                     echo 
        "</div>";
                     
        // Ende der Bildertabelle
            
        }
        // Ende Vorschaubilder anzeigen
        }
        ?>


        </div>
        <?php 
        }
        ?>
        </div>
        und das ist meine create_jpg.php:

        PHP-Code:
        <?php
        header
        ("Content-type: image/jpeg");

        // Aufruf der Funktion: 
        erzeugeBildausschnitt("php/referenzen/".$daten[gallery_ordner]."/thumbs/$daten[picture_name]"); 

        function 
        erzeugeBildausschnitt($bildQuelle){
            
        // welche Breite + Hoehe soll der Ausschnitt haben
            
        $Ausschnitt_Breite 85;
            
        $Ausschnitt_Hoehe 85;
            
            
        // welcher Bereich soll dargestellt werden
            
        $Position_x 0
            
        $Position_y 0;
            
            
        $img1 imagecreatefromjpeg($bildQuelle);//OriginalDatei
            
        $img2 imagecreatetruecolor($Ausschnitt_Breite$Ausschnitt_Hoehe);//Neue Datei mit Auschnitt der Originaldatei
            
            //Was soll geschehen?
            //Aus der Hauptdatei soll ein Auschnitt (x: 15px; y:15 px; Breite: 70px; Höhe: 140px)
            //in die Neue Dateu ($img2) kopiert werden.
            
        imagecopymerge($img2$img100$Position_x$Position_y$Ausschnitt_Breite$Ausschnitt_Hoehe100);
            
            
        //Die neue Datei wird unter einem anderen Namen abgespeichert (und anschließend Speicher gelöscht)
            
            
        imagejpeg($img2);
            
        imagedestroy($img1);
            
        imagedestroy($img2);

        }
        ?>

        Kommentar


        • #5
          Moment du bringst hier die ganze Zeit etwas durcheinander.

          Es handelt sich hier um eigenständige Skripte. Du kannst nicht einfach in der create_jpg.php auf den in deiner gallery_list.php (oder wie die Datei heißt) erstellten PHP-Array zugreifen.

          Du musst der create_jpg.php schon irgendwie die Info übergeben, für welches Bild nun ein Thumbnail erzeugt werden soll.

          Mehrere Hinweise noch:
          Dein Skript ist ineffektiv und verschwendet massiv Resourcen,
          1.) durch MySQL
          Code:
          $max_pictures_string = "SELECT * FROM $picture_list WHERE status='1'";
          $db_max_pictures = mysql_query ($max_pictures_string,$db_connect);
          $bilderanzahl = mysql_num_rows ($db_max_pictures);
          Das ist schlecht. Du holst ALLE Spalten und Datensätze der Tabelle deren status = 1 ist und zählst danach lediglich das Ergebnis. Das ist wahnsinnig ineffektiv. Das ist wie wenn ich dich zu deinem Opa schicke, die Äpfel an den Bäumen in seinem Garten zu zählen. Ruf ihn lieber an und lass ihn das machen. Geht schneller (gehen wir davon aus, Opa ist genauso auf Zack wie du)

          Einträge zählen tust du auf diese Weise:
          PHP-Code:
          <?php
          $sql 
          "SELECT COUNT(*) FROM tabelle WHERE condition = 1";
          $res mysql_query($sql$connection) or die(mysql_error());
          $total mysql_result($res0);
          printf("Insgesamt %u Einträge gefunden."$total);
          ?>
          Aber das beste ist, das benötigst du garnicht, denn ein SELECT wird trotz LIMIT nicht mehr Ergebnisse liefern als vorhanden sind.

          PHP-Code:
          <?php
          $sql 
          sprintf("SELECT `id` FROM `%s` WHERE `status` = 1 ORDER BY RAND() LIMIT 11"$picture_list);
          $res mysql_query($sql$connection) or die(mysql_error());
          while (
          $dat mysql_fetch_assoc($res)) {
            
          printf('[img]create_jpg.php?id=%u[/img]
          '
          $dat['id']);
          }
          ?>
          Deine create_jpg.php bekommt nun also per $_GET['id'] die Datenbank-ID übermittelt, die sie thumbnailen und anzeigen soll.

          Schritt 1:
          Jetzt wandel in deiner create_jpg.php $_GET['id'] zum Beispiel mittels
          PHP-Code:
          <?php
          $id 
          intval(@$_GET['id']);
          ?>
          in eine Zahl um (wer weiß was ein Hacker sonst übergibt).
          Das @ unterdrückt einen Fehler, sollte kein Wert übergeben werden, intval() wandelt das 1. Argument in einen INTEGER um, sollte es nicht sowieso einer sein. Anderfalls wird 0 daraus.

          Schritt 2:
          Schau nach ob die Datei für diese ID bereits als Cache-Datei existiert (häh?! - lies weiter, hierzu kommen wir gleich).
          Wenn ja, zeig die Cache-Datei an und beende das Skript mittels exit;

          Schritt 3:
          Hol dir den Pfad des Bildes mit der übergebenen ID aus der Datenbank.

          Schritt 4:
          Verkleinere das Bild so wie du es bereits tust.

          Schritt 5:
          Übergebe imagejpg() als 2. Parameter einen eindeutigen Cache-Dateinamen. Jetzt wird das Bild nicht mehr sofort angezeigt, sondern zunächst in einer Datei gespeichert. Der Vorteil ist, zukünftig kannst du statt der aufwändigen Berechnung die Cache-Datei öffnen.
          Jetzt öffne die Datei die du gerade gecachet hast mit readfile($pfad);

          Voila, ein performanter Thumbnailer mit Cache!
          Falls du sicherstellen kannst, dass nur lokale Bildpfade übergeben werden, kannst du statt der ID auch den Pfad der Datei übergeben, die verkleinert werden soll. Dann kannst du dir den Overhead des "Bildpfad über die ID aus der Datenbank holen" sparen. Pass allerdings auf, dass niemand dein Skript mißbraucht, um sich extern Thumbnails erzeugen zu lassen.

          Kommentar


          • #6
            ... *Bockmarked*
            Schau dir auch mal die verschiedenen Scripte bzw. die Bibliothek von CIX88 an:
            http://www.cix88.de/sitemap.php
            "Nobody is as smart as everybody" - Kevin Kelly
            — The best things in life aren't things

            Kommentar

            Lädt...
            X