upload en resize van foto's

  • Onderwerp starter Onderwerp starter JHx
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

JHx

Gebruiker
Lid geworden
11 jan 2006
Berichten
407
Ik ben een PHP-pagina aan het maken waarmee ik foto's kan uploaden naar mijn website, en gelijk ook resizen. Het uploaden lukt prima, maar het resizen lukt nog niet helemaal.

De bedoeling is dat de orriginele foto ge-resized wordt naar een breedte van 800px en dat er een extra thumbnail aangemaakt wordt met een breedte van 150px, telkens met behoud van de breedte/hoogte verhouding.

Voor kleine foto's lukt dat helemaal!

Voor iets grotere foto's lukt alleen de thumbnail. Bij het maken van de 800px-foto krijg ik volgende foutmelding:
Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 3200 bytes) in C:\wamp\www\voorbeeld57\index.php on line 24
(dat is de regel met imagecreatetruecolor())

Voor nog grotere foto's lukt ook het maken van de thumbnail niet, en dan krijg ik volgende foutmelding:
Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 13184 bytes) in C:\wamp\www\voorbeeld57\index.php on line 13
(dat is de regel met imagecreatefromjpeg())

Weet iemand OF dit op te lossen is, en zo ja: HOE ???
Dit is de code die ik nu gebruik:
(de code werkt alleen als de GD-lib ingeladen is)
PHP:
  <html>
    <body>
      <form action="<?php echo $_server['php-self'];  ?>" method="post" enctype="multipart/form-data">
        <input name="filFoto" size="30" type="file""><br>
        <input type="submit" name="submit" value="submit">
      </form>
<?php
  if(isset($_POST['submit'])){
    $aFoto=$_FILES['filFoto'];
    $sNaam=$aFoto['name'];
    $sTempNaam=$aFoto['tmp_name'];
    list($iBreedte,$iHoogte)=getimagesize($sTempNaam);        //vindt breedte en hoogte van de tijdelijke upload-image
    $image=imagecreatefromjpeg($sTempNaam);                   //laadt de tijdelijke upload-image in een variabele
    
    $iNieuweBreedte=150;                                      //bepaalt de breedte voor de thumbnail
    $iNieuweHoogte=$iHoogte*$iNieuweBreedte/$iBreedte;        //bepaalt de hoogte voor de tumbnail met behoud van de verhouding
    $tn=imagecreatetruecolor($iNieuweBreedte,$iNieuweHoogte); //maakt een nieuwe image aan voor de tumbnail
    imagecopyresampled($tn,$image,0,0,0,0,$iNieuweBreedte,$iNieuweHoogte,$iBreedte,$iHoogte);  //copieert tijdelijke image naar de tumbnail en resized
    imagejpeg($tn, "./tmb/$sNaam", 100);                      //slaat de thumbnail op
    echo "<img src='./tmb/$sNaam'><br>";                      //geeft de thumbnail weer
    
    $iNieuweBreedte=800;                                      //bepaalt de breedte voor de foto
    $iNieuweHoogte=$iHoogte*$iNieuweBreedte/$iBreedte;        //bepaalt de hoogte voor de foto met behoud van de verhouding
    $tn=imagecreatetruecolor($iNieuweBreedte,$iNieuweHoogte); //maakt een nieuwe image aan
    imagecopyresampled($tn,$image,0,0,0,0,$iNieuweBreedte,$iNieuweHoogte,$iBreedte,$iHoogte);   //copieert tijdelijke image naar de foto en resized
    imagejpeg($tn, "./img/$sNaam", 100);                      //slaat de foto op
    echo "<img src='./img/$sNaam'><br>";                      //geeft de foto weer
  }
?>
    </body>
  </html>
 
Ik heb de 3 mogelijke oplossingen bekeken.
Het princiepe is telkens het zelfde: zorg ervoor dat PHP meer geheugen ter beschikking krijgt. Op mijn eigen lokale server (WAMP5) werken ze alle drie perfect. De host van mijn website (one.com, verder trouwens prima host) laat echter geen van de drie mogelijkheden toe. Dat is waarschijnlijk juist om zulke dingen te vermijden: ik moest de memory_limit verhogen tot 64M terwijl de default-setting 8M is!

Ik vind het trouwens ook nog een beetje merkwaardig: geen enkele foto die ik wil uploaden is groter dan 1M. Toch werkt het niet bij een memory_limit van 8M :shocked:
Waarom heeft imagecreatefromjpeg($sTempNaam) meer dan 8M nodig, terwijl $sTempNaam kleiner is dan 1M ?
 
Ik heb de 3 mogelijke oplossingen bekeken.
Het princiepe is telkens het zelfde: zorg ervoor dat PHP meer geheugen ter beschikking krijgt. Op mijn eigen lokale server (WAMP5) werken ze alle drie perfect. De host van mijn website (one.com, verder trouwens prima host) laat echter geen van de drie mogelijkheden toe. Dat is waarschijnlijk juist om zulke dingen te vermijden: ik moest de memory_limit verhogen tot 64M terwijl de default-setting 8M is!

Ik vind het trouwens ook nog een beetje merkwaardig: geen enkele foto die ik wil uploaden is groter dan 1M. Toch werkt het niet bij een memory_limit van 8M :shocked:
Waarom heeft imagecreatefromjpeg($sTempNaam) meer dan 8M nodig, terwijl $sTempNaam kleiner is dan 1M ?

Dat klopt, om alle gegevens van een afbeelding te krijgen is enorm veel geheugen nodig.
Zo is heeft hetzelfde commando maar dan met een afbeelding van 14 MB maarliefst 256MB ram nodig!
 
Laatst bewerkt:
Ik meen ook te weten dat een volledig WITTE jpg meer bytes bevat dan een volledig ZWARTE (ben er wel niet helemaal zeker van op dit moment)

Heeft het probleem, in dat opzicht, misschien te maken met het feit dat imagecreatefromjpeg() initieel begint met een volledig witte jpg?

Zie jij trouwens een andere manier om hier omheen te werken? (behalve natuurlijk het manueel resizen van de foto's :rolleyes:)
 
Volgens mij begint hij gewoon met een transparante achtergrond.

Alleen aangezien JPG geen transparantie toe staat maakt hij er op het eind een witte achtergrond van wanneer je geen kleur niet specificeert.
 
Ik vind het trouwens ook nog een beetje merkwaardig: geen enkele foto die ik wil uploaden is groter dan 1M. Toch werkt het niet bij een memory_limit van 8M :shocked:
Waarom heeft imagecreatefromjpeg($sTempNaam) meer dan 8M nodig, terwijl $sTempNaam kleiner is dan 1M ?

Ik durf te wedden dat AL je foto's groter dan 1 Mb zijn in ongecomprimeerde vorm.

Een JPEG is een gecomprimeerd bestand. Om dit te kunnen bewerken moet het uitgepakt worden en dan heb je dus weer min of meer hetzelfde als een BMP versie van je originele bestand. Bv een sterk gecomprimeerde foto van een 6 Megapixel camera kan best 1 Mb of kleiner zijn, en in uitgepakt formaat 2000 x 3000 x 24/8 = 18 Mb eisen.

Als je een willekeurige foto opent in Photoshop dan zie je links onder hoeveel geheugen dit plaatje inneemt (uitgepakt dus).

Het verkleinen kan je trouwens ook automatiseren in Photoshop (hele batch tegelijk) of met talloze andere tools, maar dat zal niet je opzet zijn denk ik.
 
Ik durf te wedden dat AL je foto's groter dan 1 Mb zijn in ongecomprimeerde vorm.

Een JPEG is een gecomprimeerd bestand. Om dit te kunnen bewerken moet het uitgepakt worden en dan heb je dus weer min of meer hetzelfde als een BMP versie van je originele bestand. Bv een sterk gecomprimeerde foto van een 6 Megapixel camera kan best 1 Mb of kleiner zijn, en in uitgepakt formaat 2000 x 3000 x 24/8 = 18 Mb eisen.
Dat verklaart helemaal wat er aan de hand is en waarom het niet werkt.
Bottom-line is dus dat de standaard-instelling van 8M voor memory_limit tegenwoordig zo goed als waardeloos is...:confused:
Het verkleinen kan je trouwens ook automatiseren in Photoshop (hele batch tegelijk) of met talloze andere tools, maar dat zal niet je opzet zijn denk ik.
Ik vrees dat er niet veel anders zal opzitten hé...
Ik ben een website aan't maken voor een klant die absolute computerLEEK is. Hij heeft geen grafisch programma zoals Photoshop of Corel-Draw, en hij zou er trouwens ook niet mee kunnen werken. Ik zal maar eens op zoek gaan naar een EENVOUDIG tooltje waarmee hij kan resizen. Desnoods toon ik hem hoe het kan in Windows PAINT :shocked:. Laatste mogelijkheid is dat ik zelf zo'n tooltje maak met VB:shocked:

Iedereen alvast bedankt voor de bijdragen:thumb:... ik ben er weer heel wat wijzer van geworden;)
 
Resizen kan ook handig voor een hele map tegelijk met een Microsoft Windows-eigen programmaatje.
Klik hier maar eens en je hebt er geen Photoshop voor nodig.

Beetje naar beneden scrollen naar Image Resizer.
 
Leuk! Ik heb de resize-tool geïnstalleerd, en die werkt op zich perfect.
Wel jammer dat je er niet mee kan resizen met behoud van de breedte/hoogte-verhouding.
 
Daar zijn erg veel leuke tooltjes voor, hopelijk kent iemand er zo eentje die je kan gebruiken en die de aspect ratio intact laat..
 
Laatst bewerkt:
Misschien kun je er voor zorgen dat de gebruiker ze upload via FTP en vervolgens laat je een scriptje een directory uitlezen. Ik weet niet of het memory probleem dan ook blijft. (Vermoed van wel :()

Als je een file upload dan lijkt het mij dat die ook in het geheugen blijft hangen, wellicht werkt het wel wanneer het bestand al op de schijf aanwezig is...
 
Misschien kun je er voor zorgen dat de gebruiker ze upload via FTP en vervolgens laat je een scriptje een directory uitlezen. Ik weet niet of het memory probleem dan ook blijft. (Vermoed van wel :()
Ik heb het even uitgetest door eerst manueel een foto te uploaden, en er dan het resize-script op los te laten... Het probleem blijft:(

En eigenlijk is dat ook logisch hé. De <input type='file' ...> zorgt ervoor dat de foto geupload wordt naar een tijdelijk bestand op de server, waarmee je dan kan verder werken. En voor die verdere verwerking komt dat in feite neer op hetzelfe als dat je de foto manueel upload, niet?

Wel tof dat je blijft brainstormen over het probleem:thumb:
Ik vrees echter dat ik mijn toevlucht zan moeten zoeken in een tooltje waarmee ik meerdere foto's tegelijk kan resizen naar de gewenste afmetingen. Het aanmaken van de thumbnail kan dan nog altijd vanuit het PHP-script.

Toch nog één vraagje: stel dat ik de mensen bij one.com (de server van mijn website) kan overtuigen om de insteling bij memory_limit in de php.ini te verhogen tot 64M (wat ik ten zeerste betwijfel), dan vermoed ik dat dat van toepassing is voor elke account op die server, en niet enkel maar voor mij, juist??? Ik vermoed dat dat juist de reden is waarom ze het niet zullen doen...:confused:
 
Ze zullen waarschijnlijk dat verzoek niet honoreren :) Precies om de reden die jij geeft.
 
Bedankt iedereen... ik zet 'm nu op 'vraag is opgelost' !
 
Wellicht kun je iets met een java-applet proberen? Je ziet wel eens Java upload-scripts voorbij komen. Wellicht kun je daarmee dat resizen e.d. wel uitwerken?
 
Je bedoelt dus dat ik eerst client-sided de foto moet verkleinen met een javascript of -applet?

"Good thinking" dacht ik zo... en ben dus even op zoek gegaan. Uiteindelijk ben ik hier terecht gekomen.
Het aangehaalde probleem is gelijkaardig als het mijne, de voorgestelde oplossing is gelijkaardig als jou laatste bericht, maar de reacties zijn allemaal dat zoiets niet kan :confused:

Heb jij een voorbeeld van een script of applet waarmee het wel kan? (het artikel is ondertussen ook al 3 jaar oud he ;))
 
Javascript != Java ;)

Javascript is voor het web, Java is ook voor desktop.

Ik heb even in Google "Java upload resize applet" ingetypt en het eerste resultaat was deze betaalde applet. Iets daar onder stond deze gratis applet.

Hoe ze werken? Geen idee :o
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan