Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Bild zu groß?

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Bild zu groß?

    Hallo, hab nen ganz einfaches Thumbscript, welches auch so funktioniert wie es soll, ausser das Bild ist zu groß.
    Bei ca. 1mb bildgröße wird zwar das bild hochgeladen und an den richtigen ort gebracht, aber das thumb wird nicht erstellt.
    Leider spuckt er auch keine Fehlermeldung aus, der bildschirm bleibt weiß.
    Laut phpinfo hab ich:
    -PHP Version 5.2.11
    -post_max_size 8M
    -upload_max_filesize 2M
    -GD Version bundled (2.0.34 compatible)

    Und jetzt bin ich völlig verwirrt.
    Bild1 = 1,46mb jpg funktioniert nicht
    Bild2 = 3,10mb jpg funktioniert???
    Hier mal der Code:
    PHP-Code:
    error_reporting(E_ALL);
    $edit=$_POST['edit'];
    $file=$_POST['bild'];
    $Bild_Titel=$_POST['Titel'];
    $Error=0;
    $infos getimagesize($_FILES['userfile']['tmp_name']);
       
    //Fehlercode überprüfen
    if($_FILES['userfile']['error']>0)
      {
         echo
    'Problem: ';
         switch(
    $_Files['userfile']['error'])
           {
                case 
    1:$Error='Datei ist zu groß(Standard)'; break;
                case 
    2:$Error='Die Datei ist zu groß(Admin festgelegte größe)'; break;
                case 
    3:$Error='Dateiupload unvollständig'; break;
                case 
    4:$Error='Keine Datei wurde hochgeladen'; break;
                echo 
    $Error;
         }
       exit;
        }    
    //Prüfen ob Bilddatei
    $typ=array("image/gif","image/png","image/jpg","image/jpeg");
    if(!
    in_array($_FILES['userfile']['type'],$typ))//für Bilddatei statt "image/gif" = "image/jpeg"(auch mime-typen genannt)
      
    {
         
    $Error='Die hochgeladene Datei ist keine Bilddatei!Bitte andere Datei hochladen';
         echo 
    $Error;
         exit;
        }
        
    //Name überpfrüfen
    $i=1;
    while(
    file_exists('../../Galerie/'.$_FILES['userfile']['name']))
    {
        
    $_FILES['userfile']['name']=$_FILES['userfile']['name'].'_'.$i;
        
    $i++;
    }
    //Datei verschieben
    $upload='../../Galerie/'.$_FILES['userfile']['name'];
    if(
    is_uploaded_file($_FILES['userfile']['tmp_name']))
      {
         if(!
    move_uploaded_file($_FILES['userfile']['tmp_name'],$upload))
           {
              
    $Error='Datei konnte nicht verschoben werden';
              echo 
    $Error;
                exit;
             }
      }
    else
        {
         
    $Error='Problem beim Hochladen';
         echo 
    $Error;
         exit;
        }
        
    //Type abfangen
    /*      $filetype = $_FILES[$userfile_name]['type'];
       
          switch($filetype)
          {
             case "image/pjpeg":
                $infos[2] = 2;
             break;
             
             case "image/gif":
                $infos[2] = 1;
             break;
             
             case "image/jpeg":
                $infos[2] = 2;
             break;
             
             case "image/x-png":
                $infos[2] = 3;
             break;
             //usw.
          }
    */
    $thumb='../../Galerie/thumbs/'.$_FILES['userfile']['name'];
    $file_name='../../Galerie/'.$_FILES['userfile']['name'];
    resize($file_name$thumb150$infos);
    /*Thumb erstellen*/

    function setTransparency($new_image,$image_source)
        {  
                
    $transparencyIndex    imagecolorallocate($new_image255255255);
                
    imagefill($new_image00$transparencyIndex);
                 
    imagecolortransparent($new_image$transparencyIndex);
        }

    function 
    resize($file$save$width$infos$height=false)
    {
       if(!
    $height)
          
    $height $width;
                
       
    $iWidth $infos[0];
       
    $iHeight $infos[1];
       
    $iRatioW $width $iWidth;
       
    $iRatioH $height $iHeight;
       
       if(
    $iRatioW $iRatioH)
       {
          
    $iNewW $iWidth $iRatioW;
          
    $iNewH $iHeight $iRatioW;
       }
       else
       {
          
    $iNewW $iWidth $iRatioH;
          
    $iNewH $iHeight $iRatioH;
       } 
       
       if(
    $infos[2] == 1)
          
    $imgA = @imagecreatefromgif($file);
       elseif(
    $infos[2] == 2)
          
    $imgA = @imagecreatefromjpeg($file);
       elseif(
    $infos[2] == 3)
          
    $imgA = @imagecreatefrompng($file);
          
          
       
    $imgB = @imagecreatetruecolor($iNewW$iNewH);
       
       if(!
    $imgB)
          
    $imgB = @imagecreate($iNewW$iNewH);
       if(
    $infos[2] == 1)
          
    setTransparency($imgB,$imgA); 
       elseif(
    $infos[2] == 3){
          
    imagealphablending($imgBfalse);
          
    imagesavealpha($imgBtrue);
       }
       
       if(!@
    imagecopyresampled($imgB$imgA0000$iNewW$iNewH$infos[0], $infos[1]))
          @
    imagecopyresized($imgB$imgA0000$iNewW$iNewH$infos[0], $infos[1]);
          
       
    $re null;
       
    umask(0000);
       
       if(
    $infos[2] == 1)
          
    $re imagegif($imgB$save);
       elseif(
    $infos[2] == 2)
          
    $re imagejpeg($imgB$save100);
       else
          
    $re imagepng($imgB$save);
        
       return 
    true;
    }
    ?> 


  • #2
    Schau mal nach, auf was das memory_limit gesetzt wurde. Ein Bild braucht zum bearbeiten min x * y * 3 Byte RAM.

    Aber ohne die entsprechende Fehlermeldung kann man nur raten.

    Kommentar


    • #3
      das scheint weniger an der Größe der Datei, als mehr am JPEG-Header zu liegen - es gibt genügend Dateien mit fehlerhaftem Header ....
      "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

      Kommentar


      • #4
        memory_limit 128M

        Ja, leider kommt keine Fehlermeldung egal ob
        PHP-Code:
        error_reporting(E_ALL); 
        oder
        PHP-Code:
        error_reporting(-1);
        ini_set('display_errors'1); 
        Zitat von eagle275 Beitrag anzeigen
        das scheint weniger an der Größe der Datei, als mehr am JPEG-Header zu liegen - es gibt genügend Dateien mit fehlerhaftem Header ....
        hmm, und ich gehe stark davon aus das ich dagegen nichts machen kann?
        Wie könnte ich vorher prüfen ob der header richtig ist, um wenigstens eine Fehlermeldung ala:
        "Die Bilddatei ist beschädigt, bitte speichern sie die Bilddatei neu ab"
        zu erzeugen?

        Kommentar


        • #5
          in php wenig - du kannst höchstens die Uploader bitten die Grafik-Datei vorher mal in einem "guten" Programm zur Bildbearbeitung zu öffnen und anschließend gleich wieder zu speichern - das sollte zumindest die Header-Probleme minimieren ...

          evtl kannst du ja das Bild mit gd-Funktionen (image..) irgendwie untersuchen oder nimm direkt eine der image-Funktionen für das erzeugen des Thumbnails
          "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

          Kommentar


          • #6
            Kannst es ja jetzt erstmal mit nem selbst erstellten Bild testen, ob es wirklich an kaputten Header-Daten liegt. Ansonsten suchts du evtl Stundenlang in der falschen Richtung nach ner Lösung

            Kommentar


            • #7
              ansonsten nimm mal das hier als Anregung:

              int imagecopyresized ( resource $dst_im, resource $src_im, int $dstX, int $dstY, int $srcX, int $srcY, int $dstW, int $dstH, int $srcW, int $srcH );

              Mit imagecopyresized() kopiert man einen Teil eines Bildes (src_im) in ein
              anderes Bild (dst_im). Mit src_X und src_Y werden die X- und Y-Koordinaten
              des zu kopierenden Teils angegeben. Die Breite wird dabei mit src_W und src_H
              bestimmt.
              Der Ausschnitt wird im Bild dst_im an die X- und Y-Koordinaten dst_X bzw.
              dst_Y kopiert und dabei auf die Breite dst_W und die Höhe dst_H gebracht.
              Unterscheiden sich die Breite dst_W oder die Höhe dst_H von den Abmessungen
              des ursprünglichen Ausschnitts, so wird der Ausschnitt gedehnt oder
              geschrumpft.

              Sie auch:

              • imagecreatefromgif()
              • imagecreate()
              • imagecolorallocate()
              • imagegif()



              nach unten nach oben Beispiel

              PHP-Code:

              <?PHP
              $image 
              imagecreatefromjpeg 'imagearc.jpg' );

              $image1 imagecreate 300150 ); 

              $farbe_body=imagecolorallocate $image1222222222 ); 

              imagecopyresized $image1$image30255060150309126 ); 

              imagejpeg $image1'<DATEINAME>'100 ); // imaga-Objekt, Dateiname,Qualität
              //
              "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

              Kommentar


              • #8
                Zitat von ArtiHl Beitrag anzeigen
                Leider spuckt er auch keine Fehlermeldung aus, der bildschirm bleibt weiß.
                PHP-Code:
                      $imgA = @imagecreatefromgif($file);
                ...
                      
                $imgA = @imagecreatefromjpeg($file);
                ...
                      
                $imgA = @imagecreatefrompng($file);
                      
                ...      
                   
                $imgB = @imagecreatetruecolor($iNewW$iNewH);
                   
                ...
                      
                $imgB = @imagecreate($iNewW$iNewH);
                ...
                  
                   if(!@
                imagecopyresampled($imgB$imgA0000$iNewW$iNewH$infos[0], $infos[1]))
                      @
                imagecopyresized($imgB$imgA0000$iNewW$iNewH$infos[0], $infos[1]); 
                Und da wunderst du dich?
                Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                Kommentar


                • #9
                  @ -- is ja sowas von aua ....
                  "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

                  Kommentar


                  • #10
                    , ja so wird das nix.
                    Hab jetzt meine Fehlermeldung, nu geh ich gucken ob ich daran was ändern kann.

                    "Fatal error: Allowed memory size of 52428800 bytes exhausted (tried to allocate 20128 bytes)...."

                    Liegt wohl an der auflösung?
                    eagle275
                    "
                    Ein Bild braucht zum bearbeiten min x * y * 3 Byte RAM.
                    "
                    Denn die anderen Bilder die an sich Größer sind klappen ja.

                    Kommentar


                    • #11
                      Die simpelste Lösung wäre Speicher hochschrauben in der php ini.
                      Ansonsten mal nachforschen, wo soviel speicher verloren geht.
                      Wobei 50 MB ist nicht gerade viel.
                      sigpic

                      Kommentar


                      • #12
                        So, danke für eure Hilfe .
                        Das Problem ist das ich memory_limit scheinbar nicht höher setzten darf.
                        Hab zwar in der php.ini mal auf 500 gesetzt, was er scheinbar nicht annimmt(obwohl laut phpinfo nun auch 500 drinstehen).
                        Da muss ich mal anrufen und fragen was der max wert ist, den die voreingestellten 128 können es ja auch nicht sein.
                        Vor imagecreatefromgif hab ich
                        MEMORY: 105392
                        Nach der Forme(für truecolor):
                        "
                        Für jedes Pixel reserviert GD 5 Byte.
                        Diese 5 Byte teilen sich auf in:
                        Farbe: Rot 1 Byte
                        Farbe: Grün 1 Byte
                        Farbe: Blau 1 Byte
                        Alpha Kanal 1 Byte
                        Und 1 Byte für KA was


                        Die Formel für den Speicherverbrauch N lautet also:
                        N = x * y * 5 + W
                        "
                        ergeben sich 87M, da sind die 128m ja eigendtlich noch nicht erreicht.

                        Kommentar


                        • #13
                          Aber wie ich dir schon oben schrieb, hast du eine maximalen Speicher von 50M. Entweder, weil du nur 50M von deinem Hoster bekommst, oder weil du die anderen 78M mit etwas anderem vollgemüllt hast
                          sigpic

                          Kommentar


                          • #14
                            So, nach langen diskussionen mit meinem Provider ist der Fehler gefunden.
                            Zwar ist es richtig das ich in meinem root bei ausführung von phpinfo() 128mb habe, in meinem root hab ich auch 128mb.
                            In sämtlichen unterverzeichnissen allerding nur 50mb, und nein das habe ich so nicht eingestellt.
                            Wenn ich nun eine php.ini in das entsprechende verzeichniss anlege hab ich auch dort meine 128mb.

                            Ich danke euch für die Hilfe.

                            Thema erledigt.

                            Kommentar

                            Lädt...
                            X