Ankündigung

Einklappen
Keine Ankündigung bisher.

PNG-Bilder in Array übertragen

Einklappen

Neue Werbung 2019

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

  • PNG-Bilder in Array übertragen

    ich habe viele keine Bilder im PNG-Format. Diese möchte ich einlesen und in einem Array speichern. Anschließen soll das Array als JSON-Datei gespeichert werden.

    Später soll das Array wieder geladen werden und die Bilder im Browser ausgegeben werden.

    PHP-Code:
    $bilder = array(36);
    for (
    $ii=1$ii<66$ii++) {
        
    $_datum = (date("ymd"mktime(0,0,0date(1), date(0)+$iidate(13) ) ) );
        
    $bild[$ii-1] = addslashes(file_get_contents($_datum.".png"));
    //alternativ
        
    $bild[$ii-1] = file_get_contents($_datum.".png");

    Damit bekomme ich etwas in mein Array, was ich dann auch speichern kann.

    PHP-Code:
    File_Put_Array('Jahr13.data'$bild) or die ("Fatal: Das Array konnte nicht in Datei Jahr13.data gespeichert werden.\n"); 
    Danach sollen die einzelnen Bilder gelöscht werden.

    Mit File_Get_Array() kann ich das Array zwar wieder herstellen, aber wie bekomme ich die Bilder dann zur Anzeige?


    PHP-Code:
    $bild1=File_Get_Array('Jahr13.data'); 
    oder

    PHP-Code:
    $image1 imagecreatefrompng($path);
    header('Content-Type: image/png');
    imagepng($image1); 
    führen leider nicht zum Ziel.
    Danke



    Die Funktionen File_Put_Array() und File_Get_Array() dazu

    PHP-Code:
    function File_Put_Array($FileName, $ar) {
        return file_put_contents($FileName , '<?php $ar=' . var_export($ar, true) . ';');
    }

    function File_Get_Array($FileName) {
        include $FileName;
        return $ar;
    }
    aber wie zeige ich die Bilder dann an?

  • #2
    Schalte einfach mal das error_reporting an, das sollte schon fürs erste helfen.

    Im nächsten Schritt dann mal mit var_dump alle relevanten Variablen ausgeben.

    Gibt es eigentlich einen Grund, warum du die Bilder nicht auf der Festplatte lässt?
    Da sind sie besser aufgehoben als in PHP-Variablen.
    [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
    [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

    Kommentar


    • #3
      vielen Dank,

      error_reporting(E_ALL); war schon an.

      Die Bilder sind sehr klein (um die 160 Byte), im Dateisystem belegen sie aber 4 KB. Auch ist die Anzahl der Dateien begrenzt. Ich hoffe mit der Methode jede Menge Plattenplatz und Nodes zu sparen.

      Zur Zeit habe ich ca. 6 Millionen Nodes, die ich so auf ca. 6000 reduzieren könnte.

      PHP-Code:
      <?php

      set_time_limit
      (0);
      ignore_user_abort(true);

      error_reporting(E_ALL);

      $path "130501.png";
      $image1 file_get_contents($path);
      $bild[0] = $image1;
      $path "130502.png";
      $image1 file_get_contents($path);
      $bild[1] = $image1;
      File_Put_Array('test.data'$bild) or die ("Fatal: Das Array konnte nicht in Datei test.data gespeichert werden.\n");
      print 
      "Das Speichern hat geklappt, TestArray wird gelöscht.\n";
      unset (
      $bild);

      //  Funktionsaufruf zum Lesen:
      $bild1=File_Get_Array('test.data');

      header('Content-Type: image/png');
      imagepng($bild1[0]);

      exit;

      function 
      File_Put_Array($FileName$ar) {
          return 
      file_put_contents($FileName '<?php $ar=' var_export($artrue) . ';');
      }

      function 
      File_Get_Array($FileName) {
          include 
      $FileName;
          return 
      $ar;
      }
      ?>
      führt zu
      Die Grafik "http://127.0.0.1/test/test3.php" kann nicht angezeigt werden, weil sie Fehler enthält

      Kommentar


      • #4
        Zitat von das399igste Beitrag anzeigen
        vielen Dank,

        error_reporting(E_ALL); war schon an.

        Die Bilder sind sehr klein (um die 160 Byte), im Dateisystem belegen sie aber 4 KB. Auch ist die Anzahl der Dateien begrenzt. Ich hoffe mit der Methode jede Menge Plattenplatz und Nodes zu sparen.

        Zur Zeit habe ich ca. 6 Millionen Nodes, die ich so auf ca. 6000 reduzieren könnte.
        [...]
        Die Grafik "http://127.0.0.1/test/test3.php" kann nicht angezeigt werden, weil sie Fehler enthält
        Nun ja, die Meldung verrät dir ja schon, das etwas mit der Grafik nicht stimmt, also mal den Imageheader übergangsweise rausnehmen und PHP-Meldungen begutachten.

        Wieso ist die Anzahl der Dateien begrenzt?
        Das macht doch überhaupt keinen Sinn...

        Statt alles in ein PHP-Array zu quetschen könnte es auch besser sein alles in ein Zip-Archiv zu packen um es dann da einzeln wieder raus zu ziehen, das missbraucht den Ram-Speicher von PHP dann wenigstens nicht so stark.
        [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
        [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

        Kommentar


        • #5
          wenn ich den Imageheader raus nehme, kommt:
          Warning: imagepng() expects parameter 1 to be resource, null given ...

          Muss ich die Bildgröße irgendwo noch definieren? Oder geht die Bilddatei evtl. kaputt?

          Die Anzahl der Dateien ist durch einen Quota vom Provider begrenzt. Leider ist der Provider keiner sachlichen Diskussion dazu offen.

          Die Variante mit dem ZIP-File hatte ich zuerst versucht.
          Das Script baut eine HTML-Seite auf, in der die Bilder angezeigt werden. Fehlende Bilder werden zur Laufzeit generiert und als File gespeichert. wenn die HTML-Seite fertig ist, sollten alle Bilder in ein Zip-File geschrieben und dann gelöscht werden.

          Leider ist das löschen so schnell, das es schneller fertig ist als der Aufbau der HTLM-Seite, so das dort keine Bilder mehr zu sehen sind. Ich müsste also irgendwie warten, bis die per echo ausgegebene HTM-Seite fertig ist, weiß aber nicht wie.

          Kommentar


          • #6
            Zitat von das399igste Beitrag anzeigen
            Die Bilder sind sehr klein (um die 160 Byte), im Dateisystem belegen sie aber 4 KB
            die "blocksize" scheint mir suboptimal gewählt.
            zudem kann man in diesen fall wirklich darüber nachdenken, die bilder als bilder in der db zu speichern.

            Kommentar


            • #7
              Nur ein paar hints:
              Ich hab die Funktion imagepng() zwar noch nie benutzt, aber die Doku sagt "An image resource, returned by one of the image creation functions, such as imagecreatetruecolor()." Ob hier also der Datei-Inhalt genügt?
              Mir ist auch unklar, ob der Output nicht besser in ein <img src=""> gepackt werden muss, damit's der Browser schluckt.

              Noch was, kannst Du die vielen Dateien pro Ordner nicht auf mehrere verteilen, z.B. hierarchisch. Das geht natürlich nur, wenn die Beschränkung nicht die Zahl der inodes beschränkt. Ansonsten ist die Idee mit dem Zippen gut, weil es hier auch eine Variante gibt die nicht versucht zu komprimieren, denn das kostet Performance und bringt bei eh schon komprimierten PNGs kaum was.

              Kommentar


              • #8
                Ich frag mich: Wozu das ganze, außer das du den Speicher vollmüllst passiert da doch nichts. Wenn du eine Bild-Kollektion speichern und wiederverwenden willst, dann mach das, aber da muss auch irgendwo ein Sinn hinter stecken, denn die Bilder existieren ja schon in der selben Dimension und im selben Format nur einzeln auf dem selben Server, was den ganzen Vorgang "nicht notwendig" macht.
                [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                Kommentar


                • #9
                  @moma
                  An der "blocksize" kann ich leider nichts ändern. Die Idee mit der DB hätte was, da ich schon einige Werte in einer mySQL-DB habe.

                  @joergy
                  Die Dateien sind schon hierarchisch aufgebaut. Die Bilder stammen aus zur Zeit ca. 1100 Messstationen. Jede Messstation erzeugt pro Tag ca. 288 Messreihen und jede Messreihe besteht aus unterschiedlich vielen Messwerten. Die Messwerte einer Station werden pro Tag zu einer Grafik verdichtet. Jede Messstation hat ein eigenes Unterverzeichnis in dem dann wieder nach Jahren getrennt wird. Pro Verzeichnis komme ich dann also auf bis zu 366 Bilder. Benötigt werden in der Regel immer die Bilder eines Jahres.

                  Die Anzahl der maximalen Dateien ist über alle Verzeichnisse definiert.

                  Ich könnte mir vorstellen, die Bilder bei Bedarf aus einem ZIP zu extrahieren und dann in der DB ein Flag zu setzen, über das ein Cronjob dann Nachts die entpackten Bilder wieder entfernt.

                  PHP-Code:
                  $zip = new ZipArchive();
                  $filename "$pic_dir/$Serialnr/$year/Jahres.zip";
                  if (
                  $zip->open($filenameZIPARCHIVE::CREATE)!==TRUE) {
                      exit(
                  "cannot open <$filename>\n");
                  }
                  else {
                      
                  $addpfad $pic_dir."/".$Serialnr."/".$year."/";
                      
                  $options = array('add_path' => './''remove_all_path' => TRUE);
                      
                  $zip->addGlob($addpfad.'*.{png}'GLOB_BRACE$options);
                      
                  $zip->close();

                      
                  #$pngfile = $pic_dir."/".$Serialnr."/".$year."/*.png";
                      #foreach (glob($pngfile) as $filename) {
                          #@unlink($filename);
                      #}

                  Kann ich hier irgendwo die Kompression beeinflussen, oder benötige ich da einen anderen Code?

                  @tr0y
                  Du hats vollkommen recht. Leider habe ich vom Provider Restriktionen (maximale Anzahl der Dateien), die solche Maßnahmen erfordern.

                  Kommentar


                  • #10
                    Ich hoffe zu zahlst für den Webspace kein Geld.. Weil für umsonst gibts da schon "mehr" mit "weniger Restriktionen".
                    [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                    Kommentar

                    Lädt...
                    X