Gå til innhold

resize bilder vhja php


Anbefalte innlegg

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 av Smidt
Lenke til kommentar
Videoannonse
Annonse

Først og fremst: Fiks opp i koden, slik at den faktisk er lesbar! :mad:

 

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

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

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 av jorgis
Lenke til kommentar

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

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

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
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
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
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

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 av Smidt
Lenke til kommentar

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 av lokaltog
Lenke til kommentar

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 av Smidt
Lenke til kommentar
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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...