Smidt Skrevet 21. august 2004 Del Skrevet 21. august 2004 (endret) jeg bruker et script for opplasting av filer til en mappe på serveren min, men jeg vil bruke bildene i et cms og trenger derfor å automatisk gjøre om bildene til to størrelser f.eks. bredde eller høyre settes til 150 px og på fullversjonen til 300px. jeg har søkt masse på google og i forumet, fant bare en resizing som virket men der forsvant fargene på bildene og det var ikke tanken. jeg håper noen kan hjelpe meg på vei med dette siden jeg ikke har klart å finne ut av det selv. når bildene lastet opp lagres de med det samme navnet som de har opprinnelig, om noen også kan hjelpe meg med å forandre på opplastingsscriptet slik at jeg får et logisk bildenavn, som deretter kan skrives inn i en database (det siste skal jeg kunne klare selv ) er veldig takknemlig for all hjelp. scriptet for opplasting: ?php echo('Last opp et bilde:<br /> <FORM ENCTYPE="multipart/form-data" ACTION="' . $PHP_SELF . '" METHOD="POST"> <p><span class=\"txtomr\">Bilder:</span> <INPUT TYPE="file" NAME="userfile"> <INPUT TYPE="submit" VALUE="Upload"></p> </FORM>'); $path = "../main/"; $max_size = 1000000; if (!isset($HTTP_POST_FILES['userfile'])) exit; if (is_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'])) { if ($HTTP_POST_FILES['userfile']['size']>$max_size) { echo "The file is too big<br>n"; exit; } if (($HTTP_POST_FILES['userfile']['type']=="image/gif") || ($HTTP_POST_FILES['userfile']['type']=="image/pjpeg") || ($HTTP_POST_FILES['userfile']['type']=="image/jpeg") || ($HTTP_POST_FILES['userfile']['type']=="image/png")) { if (file_exists($path . $HTTP_POST_FILES['userfile']['name'])) { echo "The file already exists<br>n"; exit; } $res = copy($HTTP_POST_FILES['userfile']['tmp_name'], $path . $HTTP_POST_FILES['userfile']['name']); if (!$res) { echo "upload failed!<br>n"; exit; } else { echo "upload sucessful<br>"; } echo "File Name: ".$HTTP_POST_FILES['userfile']['name']."<br>"; echo "File Size: ".$HTTP_POST_FILES['userfile']['size']." bytes<br>"; echo "File Type: ".$HTTP_POST_FILES['userfile']['type']."<br>"; } else { echo "Wrong file type<br>n"; exit; } } $my_file = $HTTP_POST_FILES['userfile']['name']; ?> <p><a href="../main/">opplastede bilder</a></p> <?php $the_array = Array(); $handle = opendir('../main/'); while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { /* as descripted below: these "files" will not be added to the array */ $the_array[] = $file; } } closedir($handle); foreach ($the_array as $element) { echo "$element @br /@ \n"; } ?> Endret 21. august 2004 av Smidt Lenke til kommentar
Cucum(r) Skrevet 21. august 2004 Del Skrevet 21. august 2004 Har du sett på PHP's bildefunksjoner? httimagecopyresized() og getimagesize() kan kanskje hjelpe deg? Lenke til kommentar
jorgis Skrevet 21. august 2004 Del Skrevet 21. august 2004 Først og fremst: Fiks opp i koden, slik at den faktisk er lesbar! Punkt 2: Det er ikke rart hvis ting ikke funker: du har glemt den åpnende < i "<?php" helt i begynnelsen... Punkt 3: HTML-tags skrives i lowercase. Hvis ikke, validerer det ikke. Punkt 4: $PHP_SELF funker kun hvis du har register_globals påskrudd, noe som relativt få har. Bruk heller $_SERVER['PHP_SELF']. Punkt 5: Du trenger ikke escape " når du bruker ' til å begrense strengen. Skikkelig fikset kode: <?php echo('Last opp et bilde:<br /> <form enctype="multipart/form-data" action="' . $_SERVER['PHP_SELF'] . '" method="post"> <p><span class="txtomr">Bilder:</span> <input type="file" name="userfile"> <input type="submit" value="Upload"></p> </form>'); $path = '../main/'; $max_size = 1000000; if (!isset($HTTP_POST_FILES['userfile'])) { exit; } if (is_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'])) { if ($HTTP_POST_FILES['userfile']['size']>$max_size) { echo "The file is too big<br>n"; exit; } if ( ($HTTP_POST_FILES['userfile']['type'] == 'image/gif') || ($HTTP_POST_FILES['userfile']['type'] == 'image/pjpeg') || ($HTTP_POST_FILES['userfile']['type'] == 'image/jpeg') || ($HTTP_POST_FILES['userfile']['type'] == 'image/png')) { if (file_exists($path . $HTTP_POST_FILES['userfile']['name'])) { echo "The file already exists<br>n"; exit; } $res = copy($HTTP_POST_FILES['userfile']['tmp_name'], $path . $HTTP_POST_FILES['userfile']['name']); if (!$res) { echo 'upload failed!<br />\n'; exit; } else { echo 'upload sucessful<br />'; } echo 'File Name: ' . $HTTP_POST_FILES['userfile']['name'] . '<br />'; echo 'File Size: ' . $HTTP_POST_FILES['userfile']['size'] . ' bytes<br>'; echo 'File Type: ' . $HTTP_POST_FILES['userfile']['type'] . '<br />'; } else { echo "Wrong file type<br/>\n"; exit; } } $my_file = $HTTP_POST_FILES['userfile']['name']; ?> <p><a href="../main/">opplastede bilder</a></p> <?php $the_array = Array(); $handle = opendir('../main/'); while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { /* as descripted below: these "files" will not be added to the array */ $the_array[] = $file; } } closedir($handle); foreach ($the_array as $element) { echo "$element @br /@ \n"; } ?> Rundt her kan du bytte ut $HTTP_POST_FILES['userfile']['name'] med et databasekall og henting av passende navn/id fra database: $res = copy($HTTP_POST_FILES['userfile']['tmp_name'], $path . $HTTP_POST_FILES['userfile']['name']); Uki? Lenke til kommentar
Smidt Skrevet 21. august 2004 Forfatter Del Skrevet 21. august 2004 takk, jorgis. hadde glemt en < nrå når jeg kopierte koden. jeg har foreløpig konsentrer meg mest om php og mysql og kan ikke så mye om resizing av bilder så det hadde vært supert om noen kan hjelpe meg litt på vei der. har søkt gjennom mye på google og i mye av det jeg fant (som jeg ikke klarte å få noe ut av) ble GD nevnt. hva er dette og er det noe som kan hjelpe meg på vei? Det hadde vært kjekkest om noen kunne hjelpe meg å finne en løsning som ikke krever for mange forandringer på selve servere da det bilr lettere å legge inn det samme på andre serverer seinere. Lenke til kommentar
jorgis Skrevet 21. august 2004 Del Skrevet 21. august 2004 (endret) Ta en liten titt på getimagesize(), som gir deg dimensjonene på bildet. Deretter kan du bruke den infoen du fikk (hvis du i det hele tatt trenger den) til å bruke imagecopyresized() til å flytte bildet istedenfor bare copy(). Hvis du er litt flink med RTFM, kan du klare resten selv bare med dette? PS: Mulig du må bruke imagecreatefromjpeg() og tilsvarende funksjoner, samt url=http://no.php.net/manual/en/function.imagepng.php]imagepng()[/url] og tilsvarende. EDIT: GD er navnet på PHPs innebygde bildebehandlingsfunksjoner. Fra og med PHP 4.2 elns. ble GD inkludert i PHP som standard. Endret 21. august 2004 av jorgis Lenke til kommentar
Smidt Skrevet 21. august 2004 Forfatter Del Skrevet 21. august 2004 okei, jeg skal ta en titt på funksjonene du gav meg jorgis og prøve å sette sammen litt kode. hvis jeg støter på problemer (tror det er sannsynlig) skal jeg poste her. okei, så GD er noe som følger med standard? når en fil lastes opp med scriptet jeg postet over er det mulig å endre det slik at filen som lagres får et logisk navn, som f.eks. img01org.jpg? Lenke til kommentar
jorgis Skrevet 21. august 2004 Del Skrevet 21. august 2004 Ja. Det er bare å endre $res = copy($HTTP_POST_FILES['userfile']['tmp_name'], $path . $HTTP_POST_FILES['userfile']['name']); til (f.eks.) $res = copy($HTTP_POST_FILES['userfile']['tmp_name'], $path . $logisk_navn_som_er_hentet_fra_databasen_tidligere_i_scriptet); Btw: copy() bør byttes ut med imagecopyresized(). Lenke til kommentar
Smidt Skrevet 22. august 2004 Forfatter Del Skrevet 22. august 2004 okei, så jeg må generere et bildenavn på en måte. f.eks. om jeg sjekker hvor mange bilder som er lagret i databasen og teller de vhja count og så legger til en og gir det nye bildet navn: img$antallorg.filnavn? jeg så på linkene og leste litt frem og tilbake, men jeg forstod ikke så mye av det. om RTFM betyr read the f*ing manual så fikk ikke jeg det helt til heller. jeg vet liksom ikke helt hvor jeg skal sette inn ny bildestørrelse eller hvordan jeg skal gå frem. hadde vært supert med en liten dytt så jeg kom i gang. Lenke til kommentar
petterg Skrevet 22. august 2004 Del Skrevet 22. august 2004 Ta en kikk på imagemagick. Den skal vistnok samarbeide godt med php, men det fikk ikke jeg til den gang jeg prøvde. Løsningen min ble heller å la php kjøre shell kommandoene til imagemagick. Lenke til kommentar
Smidt Skrevet 22. august 2004 Forfatter Del Skrevet 22. august 2004 Ta en kikk på imagemagick. Den skal vistnok samarbeide godt med php, men det fikk ikke jeg til den gang jeg prøvde. Løsningen min ble heller å la php kjøre shell kommandoene til imagemagick. så du brukte koden til imagemagick for å resize? du trengte ikke installere noe? Lenke til kommentar
jorgis Skrevet 22. august 2004 Del Skrevet 22. august 2004 GD er mye lettere å bruke enn imagemagick, siden imagemagick krever installasjon/upload av binærbibliotek, samt exec-kommandoer istedenfor rene funksjonskall. Smidt: Ta en titt på imagecopyresized(). Den er det du trenger. Lenke til kommentar
Smidt Skrevet 22. august 2004 Forfatter Del Skrevet 22. august 2004 GD er mye lettere å bruke enn imagemagick, siden imagemagick krever installasjon/upload av binærbibliotek, samt exec-kommandoer istedenfor rene funksjonskall. Smidt: Ta en titt på imagecopyresized(). Den er det du trenger. okei, will do that. skal studere litt i dag/ kveld og så kommer jeg med spørsmål i morgen. Lenke til kommentar
jorgis Skrevet 22. august 2004 Del Skrevet 22. august 2004 (endret) Guddie. Beklager at vi av og til virker litt brysk her, men RTFM er av og til det beste svaret. Endret 22. august 2004 av jorgis Lenke til kommentar
petterg Skrevet 23. august 2004 Del Skrevet 23. august 2004 Ta en kikk på imagemagick. Den skal vistnok samarbeide godt med php, men det fikk ikke jeg til den gang jeg prøvde. Løsningen min ble heller å la php kjøre shell kommandoene til imagemagick. så du brukte koden til imagemagick for å resize? du trengte ikke installere noe? Både-og. På stud.ntnu ligger den inne. Den kom med da jeg instalerte RedHat (husker ikke om jeg krysset av på den under install.) Siden har jeg holdt meg til gentoo, og der må den instaleres. Hvis du skal resize .psd (photoshop) bilder må du kjøre flatten først. Resize virker ikke likt på alle layerene! (bug) Lenke til kommentar
Smidt Skrevet 23. august 2004 Forfatter Del Skrevet 23. august 2004 (endret) jeg har lest i manualen ( og sett på kommentarene under) og kommet frem til et resizing script som er supert. det eneste dumme er at det bare virker på jpg. jeg lurer på om det er mye arbeid å gjøre dette scriptet om slik at jeg kan bruke det til jpg, png, gif og jpeg. function createThumb($sfile,$dfile) { // the passed variables are string filenames, the source and the destination global $maxwidth,$maxheight; $simg = imagecreatefromjpeg($sfile); $currwidth=imagesx($simg); $currheight=imagesy($simg); //set the dimensions of the thumbnail if ($currheight>$currwidth*1.7) { $zoom=$maxheight/$currheight; $newheight=$maxheight; $newwidth=$currwidth*$zoom; } else { $zoom=$maxwidth/$currwidth; $newwidth=$maxwidth; $newheight=$currheight*$zoom; } //create the resource img for the thumbnail $dimg = imagecreate($newwidth, $newheight); //convert truecolor immage resource to palette image resource (so we can count the colors...) imagetruecolortopalette($simg, false, 256); $palsize = ImageColorsTotal($simg); for ($i = 0; $i<$palsize; $i++) { $colors = ImageColorsForIndex($simg, $i); ImageColorAllocate($dimg, $colors['red'], $colors['green'], $colors['blue']); } imagecopyresized($dimg, $simg, 0, 0, 0, 0, $newwidth, $newheight, $currwidth, $currheight); imagejpeg($dimg,$dfile); ImageDestroy($simg); ImageDestroy($dimg); } $maxwidth=150; $maxheight=150; createThumb("take_panorama.JPG","take_panorama_thumb.JPG"); Endret 23. august 2004 av Smidt Lenke til kommentar
Lokaltog Skrevet 23. august 2004 Del Skrevet 23. august 2004 (endret) Bildefunksjonene i PHP er forbausende enkle å bruke. GIF funker ikke med GD 1.6 eller nyere (pga. patentrestriksjoner), men PNG funker helt fint. For PNG: function createThumb($sfile,$dfile) { // the passed variables are string filenames, the source and the destination global $maxwidth,$maxheight; $simg = imagecreatefrompng($sfile); $currwidth=imagesx($simg); $currheight=imagesy($simg); //set the dimensions of the thumbnail if ($currheight>$currwidth*1.7) { $zoom=$maxheight/$currheight; $newheight=$maxheight; $newwidth=$currwidth*$zoom; } else { $zoom=$maxwidth/$currwidth; $newwidth=$maxwidth; $newheight=$currheight*$zoom; } //create the resource img for the thumbnail $dimg = imagecreate($newwidth, $newheight); //convert truecolor immage resource to palette image resource (so we can count the colors...) imagetruecolortopalette($simg, false, 256); $palsize = ImageColorsTotal($simg); for ($i = 0; $i<$palsize; $i++) { $colors = ImageColorsForIndex($simg, $i); ImageColorAllocate($dimg, $colors['red'], $colors['green'], $colors['blue']); } imagecopyresized($dimg, $simg, 0, 0, 0, 0, $newwidth, $newheight, $currwidth, $currheight); imagepng($dimg,$dfile); ImageDestroy($simg); ImageDestroy($dimg); } $maxwidth=150; $maxheight=150; createThumb("take_panorama.png","take_panorama_thumb.png"); Du må sikkert også legge inn en funksjon som sjekker filendelsen slik at du kaller riktig funksjon for riktig filtype. Edit: dette scriptet outputter også PNG-bilder. imagepng($dimg,$dfile); er den magiske funksjonen for å outputte PNG-bilder istedenfor JPEG. Bruk imagejpeg($dimg,$dfile); for å outputte JPEG-bilder. Endret 23. august 2004 av lokaltog Lenke til kommentar
jorgis Skrevet 23. august 2004 Del Skrevet 23. august 2004 Ergo var det ikke værre enn å bytte ut 'jpeg' i funksjonskallene med 'png'. Lenke til kommentar
Smidt Skrevet 23. august 2004 Forfatter Del Skrevet 23. august 2004 (endret) vel tok poenget med at det er imagepng() som utgjør forskjellen, men er det funksjon jeg kan sjekke filendelsen med? hva skal jeg gjøre om jeg vil bruke gif bilder da? krever det mye arbeid å legge det til og? edit: kan jeg bruke filtype() til å sjekke filendelsen? Endret 23. august 2004 av Smidt Lenke til kommentar
jorgis Skrevet 23. august 2004 Del Skrevet 23. august 2004 edit: kan jeg bruke filtype() til å sjekke filendelsen? Nei. Den returnerer bare "file" hvis det er en fil, ergo vil du ikke kunne se forskjell på en .png-fil og en .jpeg-fil. Det du kan bruke for å få fatt i filnavnet er explode(), iom. at et filnavn faktisk er en slags punktum-separert liste. En kodesnutt som dette ville funke som dynamitt: $filnavn = explode('.', $filnavnfrauploadgreie); echo $filnavn[1]; // vil dytte ut "jpg", "jpeg" eller "png" osv. Uki? Lenke til kommentar
Smidt Skrevet 23. august 2004 Forfatter Del Skrevet 23. august 2004 supert jorgis det med gif, er det et stort prosjekt å integrere det i resizingen? Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå