"image2string"

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

  • "image2string"

    Hi,

    ich will die Thumbs, die ich von Bildern erstelle in einer Datenbank speichern.
    Jetzt kommt die spannende Frage: wie kann ich das verkleinerte Bild in einen Sting packen?

    Das Bild ist ja bisher in der Resource id #x gespeichert.
    Wie komm ich jetzt aber wirklich an den Inhalt ran?
    Wenn die Tatsachen nicht mit der Theorie übereinstimmen –

    um so schlimmer für die Tatsachen.

  • #2
    Re: "image2string"

    image(jpeg|png|gif)

    vor diesen befehlen das output buffering anschalten, und anschließend bufferinhalt in variable holen (http://www.php.net/manual/de/ref.outcontrol.php).
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      perfekt.

      Danke
      Wenn die Tatsachen nicht mit der Theorie übereinstimmen –

      um so schlimmer für die Tatsachen.

      Kommentar


      • #4
        Darf man fragen, warum du nicht nur die URL der Bilder in der DB speicherst und die Bilder selbst als Dateien? So könnte sie der Webserver direkt ausliefern, ohne den Umweg über ein PHP-Script, das wiederum den Umweg über die DB nehmen muß.

        Kommentar


        • #5
          Punkt 1: wesentlich schneller

          Punkt 2: ich will Kontrolle darüber haben wer, wann, wie oft auf di Bilder zugreift und die verkleinerten Bilder nach einer Zeit löschen, wenn sie nicht genutzt werden.

          Punkt 3: Egal wo ich die Dateien ablege, muss ich immer die DB abfragen, da die Adresse der Thumbs in der Datenbank gespeichert werden.

          [Dein Weg]

          - Datenbank abfragen, ob Bild vorhanden ist

          Wenn nicht vorhanden {
          - Bild erstellen
          - Bild in Datenbank eintragen
          }else{
          - Bild aus Datei auslesen
          }
          - Bild ausgeben
          [/Dein Weg]

          [Mein Weg]
          - Datenbank abfragen, ob Bild vorhanden ist

          Wenn nicht vorhanden {
          - Bild erstellen
          - Bild in Datenbank eintragen
          }

          - Bild ausgeben
          [/Mein Weg]

          ich spar mir also das auslesen aus der Datei, wobei ein Datenbankzugriff immer schneller ist als ein Dateizugriff.
          Wenn die Tatsachen nicht mit der Theorie übereinstimmen –

          um so schlimmer für die Tatsachen.

          Kommentar


          • #6
            [Dein Weg]
            - Datenbank abfragen, ob Bild vorhanden ist
            Wenn nicht vorhanden {
            - Bild erstellen
            - Bild in Datenbank eintragen
            }else{
            - Bild aus Datei auslesen
            }
            - Bild ausgeben
            [/Dein Weg]
            Nene, mein Weg wäre:
            - DB abfragen
            - Ergebnis (URL) an den Browser ausgeben

            Ob dein Weg schneller ist, wäre noch zu beweisen.

            Kommentar


            • #7
              Punkt 1: wesentlich schneller
              $skepsis = true;

              gibt's dazu messergebnisse?

              Kommentar


              • #8
                PHP-Code:
                if(true==$skepsis){

                  print 
                time_function('image_thumb_filebased'$a_params);
                  print 
                "\n";
                  print 
                time_function('image_thumb_mysqlbased'$a_params);


                Ausgabe (Mittelwert 10facher Ausführung):

                0.163s
                0.055s
                Wenn die Tatsachen nicht mit der Theorie übereinstimmen –

                um so schlimmer für die Tatsachen.

                Kommentar


                • #9
                  keine schlechte idee, nur fehlt mir noch der quellcode von image_thumb_filebased() und image_thumb_mysqlbased(). wobei ich ersteres gern selbst vorbereiten würde.

                  aber zeig mir u.a. deine lösung.

                  Kommentar


                  • #10
                    Das wird jetzt eine witzige Schnitzeljagt durch meine Bibilotheken

                    Das ist so verwurzelt in meinen Bibliotheken, dass es fast unmöglich wird da alle betreffenden Funktionen rauszufischen.

                    Wenn ich heute Abend daheim bin und Zeit finde schreibe ich vielleicht mal eine Funktion, die auf keine Bibilothek basiert.

                    Aber hier ist trotzdem mal der QT des eigentlichen Skriptes:
                    PHP-Code:
                    <?PHP
                    require_once("../config/config.initialization.php");
                    require_once(
                    LIB_DIR."lib.image.php");
                    require_once(
                    LIB_DIR."lib.file.php");

                    $b_border=($_GET['border']=='true')
                        ? 
                    true
                        
                    false;
                        
                    $b_fixed=($_GET['fixed']=='true')
                        ? 
                    true
                        
                    false;
                    /**
                     * Prüfe, ob das Bild in dieser Größe schon mal verkleinert wurde
                     */

                    $s_cached_pic=get_cached_image(
                        
                    $_GET['img'],
                        
                    $_GET['height'],
                        
                    $_GET['width'],
                        
                    $b_fixed,
                        
                    $b_border,
                        
                    $c_sql);

                    if(!empty(
                    $s_cached_pic)){
                        
                    $r_img=imagecreatefromstring($s_cached_pic);
                        
                    imagepng($r_img);
                        unset(
                    $r_img);
                        
                        
                    }else{
                        
                        
                    ob_start();
                        
                    /**
                         * Speiche den Pfad zum Bild in Mysql
                         */


                        
                    image_resize(DOCUMENT_ROOT.$_GET['img'], true$_GET['height'], $_GET['width'], $b_fixed$b_border);

                        
                    $bi_image=ob_get_contents();
                        
                    ob_end_flush();
                            
                        
                    insert_cached_image(
                            
                    $_GET['img'],
                            
                    $_GET['width'],
                            
                    $_GET['height'],
                            
                    $b_fixed,
                            
                    $b_border,
                            
                    $bi_image,
                            
                    $c_sql);
                    }
                    ?>
                    Bin mal gespannt auf den evtl. Timing-Contest
                    Wenn die Tatsachen nicht mit der Theorie übereinstimmen –

                    um so schlimmer für die Tatsachen.

                    Kommentar


                    • #11
                      unglaublich. habe es eben lokal selbst getestet.

                      meine und onemorenerds methode (mysql -> varchar -> echo '<img...'):
                      zwischen 245 und 270 ms pro aufruf

                      deine methode (mysql -> blob -> header -> echo):
                      zwischen 0,16 und 0,18 ms pro aufruf (!)

                      das ist in der tat ca. 1500 mal schneller.
                      experimentiert mit dem php-logo (ca. 4,5 kb) und einem foto (453 kb).

                      vermutlich wird der faktor 1500 schnell sinken, wenn die tabelle größer wird.
                      EDIT:
                      viel zu übertrieben, weiter unten aktualisierung.
                      Zuletzt geändert von penizillin; 31.07.2005, 17:53.

                      Kommentar


                      • #12
                        Entweder Dein Rechner ist schneller als mein Pentium 2 Webserver *g*, oder eine der Funktionen passt nicht.

                        Wenn bei mir das Einlesen der Datei und das anschließende ausgeben 0,163 Sekunden braucht und das direkte Ausgeben aus der DB 0,055 Sekunden, dann deckt sich das nicht wirklich mit deinen Ergebnissen.

                        ==> Entweder meine Mysql-Klasse ist verdammt langsam, oder Du hast beim Auslesen der Bilddatei irgendwie was verdreht... *grübel*



                        Was gibt es für Möglichkeiten das Bild zu lesen und auszugeben?

                        1.
                        header
                        print file_get_contents(..)

                        2.
                        imagecreatefrompng(...)
                        imagepng(...)

                        3
                        $r_file=fopen(...)
                        imagecreatefromstring(freads(...))
                        flose(...)
                        imagepng(...)


                        ....

                        Theoretisch müsste die dritte die schnellste sein, aber auch nur theoretisch.
                        Wenn die Tatsachen nicht mit der Theorie übereinstimmen –

                        um so schlimmer für die Tatsachen.

                        Kommentar


                        • #13
                          Code:
                          CREATE TABLE `test` (
                            `wert` varchar(10) default NULL,
                            `test` blob
                          ) TYPE=MyISAM;
                          mein weg:
                          PHP-Code:
                          //banale direkte verbindung zur db

                          $query "SELECT `wert` FROM `test`";
                          $result mysql_query($query);

                          $row mysql_fetch_assoc($result);
                          echo 
                          "<img src='".$row['wert']."' />" 
                          dein weg:
                          PHP-Code:
                           //banale direkte verbindung zur db

                          $query "SELECT `test` FROM `test`";
                          $result mysql_query($query);

                          $row mysql_fetch_assoc($result);

                          header('Content-Type: image/gif');
                          echo 
                          $row['test']; 
                          zum messen wurde das beispiel aus der microtime() doku genommen.
                          habe die messungen etwas nachgebessert.

                          db: ca. 0,16 ms
                          fs: ca. 1,4 ms

                          also faktor ca. 8,75
                          Zuletzt geändert von penizillin; 31.07.2005, 17:52.

                          Kommentar


                          • #14
                            noch mal edit:

                            habe einen fehler in der art gemacht, wie ich teste.
                            korrigiert.

                            die db gefüllt (1666 einträge, ca. 7,7 mb in der tabelle).

                            noch mal getestet. diesmal durchschnitt aus 100 durchläufen.

                            mein weg: 58 ms
                            dein weg: 59 ms

                            gleichstand?
                            Zuletzt geändert von penizillin; 31.07.2005, 18:23.

                            Kommentar


                            • #15
                              Moment!


                              Das Verhältnis der Ausführungszeiten ist in diesem Fall nicht gleich dem Verhältnis der Wartezeit für den Benutzer.


                              Teste das ganze mal mit ab von apache.

                              Bei deiner Möglichkeit muss Apache die Datei erst wieder öffnen und ausgeben. Bei meiner Möglichkeit ist das schon passiert.

                              PS. Wie ist der Aufbau deiner Mysql-Tabelle? Ich habe rund 600 MB in der Datenbank und die Anfragen sind unwesentlich langsamer als wie bei einer leeren Datenbank.

                              Ich habe eben einen Index auf das ID Feld und suche nur nach der ID
                              Wenn die Tatsachen nicht mit der Theorie übereinstimmen –

                              um so schlimmer für die Tatsachen.

                              Kommentar

                              Lädt...
                              X