Avatar billede gqo Nybegynder
02. januar 2011 - 17:09 Der er 8 kommentarer og
1 løsning

kode til automatisk reducering af billedestørrelse

Hej.
Er der nogen der har en php kode der automatisk reducerer en billedstørrelse til eks. 80x80 px?? som skal bruges til upload i mysql??
pft. Gert
Avatar billede repox Seniormester
02. januar 2011 - 22:30 #1
Det bliver ikke et spørgsmål der er så forfærdeligt let at besvare.

At lave en funktion der 'automatisk reducerer' et billede til en specifik størrelse, er faktisk et temmeligt stort spørgsmål, når man ikke har nogen kildekode at give et eksempel i. Og hvilke billederedigeringsværktøjer har du til rådighed på den server du er på?

Og hvad mener du helt specifikt når du skriver 'bruges til upload i mysql'? Er det fordi du vil indlæse de binære data i MySQL? Eller hvordan skal det forstås?
Avatar billede HBP2 Praktikant
03. januar 2011 - 09:45 #2
Hvis serveren har en nogenlunde standard Linux installation, så kan du bruge programmet "convert". I PHP:

// save the file
file_put_contents("/tmp/old.png", $pngfile);
// convert the file
system("/usr/bin/convert /tmp/old.png -resize 80x80\! /tmp/new.png");
// load the new file
$pngfile = file_get_contents("/tmp/new.png");

! efter størrelsen er vigtig.

Man kan osse lave noget med image() funktionerne, men der skal en del programmering til og det bliver langsomt hvis skaleringen skal være god kvalitet.
Avatar billede repox Seniormester
03. januar 2011 - 09:57 #3
#2
En 'standard Linux installation' indeholder ikke et program der hedder 'convert' Convert er en del af ImageMagick software pakken som heller ikke er en del af en 'standard Linux installation'.

Ydermere er det ikke sikkert at dit kodeeksempel virker, da der ikke er nogen garanti for at brugeren har adgang til /tmp på serveren. Ej heller giver det mening at navngive et billede statisk, da det unægteligt vil skabe en race condition når mere end en bruger anvender siden. Der er heller ingen garanti for at convert er placeret på den statiske sti som du har angivet - hvad hvis OP kun har safe mode adgang?

GD lib bliver ikke langsommere i takt med at kvaliteten skal være højere (især ikke til et 80x80px billede). Det er et spørgsmål om hukommelses forbruget, hvilket er den hyppigste årsag til at de fleste udviklere vælger GD lib fra. Også på trods af de ekstra liniers kode.
Avatar billede HBP2 Praktikant
03. januar 2011 - 10:20 #4
Jeg vil nu sige at der er langt imellem Linux'er som ikke indeholder imagemagick - og jeg skrev jo "nogenlunde". Men teknisk set har du da ret - og der er jo heller ikke rigtigt noget der hedder "standard" Linux.

Mit svar handlede om hvordan man bruger "convert" - ikke hvordan man gemmer filer på disk eller hvilke navne man skal bruge.

Hvad hastighed angår - jeg glemte/overså imagecopyresampled() og tænkte istedet på at lave det manuelt, tak for at du fik mig til at kigge på imagecopyresampled().

Her er et eksempel som bruger imagecopyresampled(). Og ja, jeg ved det ikke vil virke hvis GD ikke er inkluderet i PHP, eller hvis det er en gammel GD, eller hvis man ikke har adgang til /tmp eller hvis der ikke er hukommelse nok, eller hvis input ikke er PNG (så skal man måske bruge imagecreatefromstring()) eller 100 andre ting!


$old = imagecreatefrompng("/tmp/old.png");
$w = imagesx($old);
$h = imagesy($old);
$new = imagecreatetruecolor(80, 80);
imagecopyresampled($new, $old, 0, 0, 0, 0, 80, 80, $w, $h);
imagepng($new, "/tmp/new.png");
imagedestroy($new);
imagedestroy($old);
Avatar billede gqo Nybegynder
03. januar 2011 - 14:03 #5
Tak for alle de hurtige svar,, (mit spørgsmål var nok lidt tåget), fandt en kode der laver en thumbnail, på hvad jeg nu vælger eks. 80x80 px.(jpg), thump uplodader ok, kvalitet ok, men der er en fejl, se herunder.. men er der noget der er simplere?? det drejer sig blot om at skalere et billede ned til eks, de 80x80 px.?? så enkel, og let som mulig, er ikke hel hjemme i PHP (endnu)!!
endnu engang tak.. Gert

Warning: imagejpeg() [function.imagejpeg]: Unable to open

'resize/resize_4123c7c7b3ee9e52b9c09cce57c685cb867f9803.jpg' for writing: Permission denied in /var/www/filupload/jpgtest.php on line 57
File (4123c7c7b3ee9e52b9c09cce57c685cb867f9803.jpg) uploaded succesfully, but resize and thumb failed

<?php

//http://www.eksperten.dk/spm/927549



//SETTINGS

$uploadDir        = 'gaest/'; //Bibliotek, hvor filer uploades til - husk chmod 777

$allowedFileTypes = array('jpg','gif','png'); //Hvilke filer vil vi acceptere bliver uploadet?



//THUMBS SETTINGS

$thumbDir        = 'thumbs/'; //Bibliotek, hvor thumbs gemmes - husk chmod 777

$thumbPrefix      = 'thumb_';  //Hvad skal tilføjes til originalt filnavn?

$thumbHeight      = 80;      //Thumb højde

$thumbWidth      = 80;      //Thumb bredde

$thumbQuality    = 85;        //Kvalitet af thumb, kan være fra 0 - dårligt til 100 - bedst



//RESIZED SETTINGS

$resizeDir        = 'resize/'; //Bibliotek, hvor thumbs gemmes - husk chmod 777

$resizePrefix      = 'resize_'; //Hvad skal tilføjes til originalt filnavn?

$resizeHeight      = 600;      //Thumb højde

$resizeWidth      = 500;      //Thumb bredde

$resizeQuality    = 85;        //Kvalitet af thumb, kan være fra 0 - dårligt til 100 - bedst



//Funktioner som bruges:

function getExtension($filename){

  return strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) );

}



function resize( $filename, $newfilename, $maxw, $maxh, $quality=85 ){

  $extension = getExtension($filename);

  switch($extension){

    case 'jpeg':

    case 'jpe':

    case 'jpg':

      $srcim = imagecreatefromjpeg( $filename );

      break;

    case 'gif':

      $srcim = imagecreatefromgif( $filename );

      break;

    case 'png':

      $srcim = imagecreatefrompng( $filename );

      break;

    default:

      return false;

  }

  $ow = imagesx( $srcim );

  $oh = imagesy( $srcim );

  $wscale = $maxw / $ow;

  $hscale = $maxh / $oh;

  $scale = min( $hscale, $wscale );

  $nw = round( $ow * $scale, 0 );

  $nh = round( $oh * $scale, 0 );

  $dstim = imagecreatetruecolor( $nw, $nh );

  imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh );

  switch($extension){

    case 'jpeg':

    case 'jpe':

    case 'jpg':

      imagejpeg( $dstim, $newfilename, $quality );

      break;

    case 'gif':

      imagegif( $dstim, $newfilename );

      break;

    case 'png':

      $png_q = floor( abs( $quality / 10 - 9.9 ) );

      imagepng( $dstim, $newfilename, $png_q );

      break;

    default:

      return false;

  }

  imagedestroy( $dstim );

  imagedestroy( $srcim );

  return file_exists($newfilename);

}



//Er der trykket på Upload file knappen?

if(isset($_POST['myUpload'])){

  //Har vi en fil?

  if(is_uploaded_file($_FILES['myFile']['tmp_name'])){

    //Filendelse

    $extension = getExtension($_FILES['myFile']['name']);

   

    $new_filename = sha1(uniqid());

   

    //Er filen en af de filer vi gerne vil have?

    if(in_array($extension,$allowedFileTypes)){

     

      //Vi flytter filen fra tmp til vores UPLOADDIR

      if(move_uploaded_file($_FILES['myFile']['tmp_name'],$uploadDir . $new_filename . '.' . $extension)){

          if(

            resize($uploadDir . $new_filename . '.' . $extension, $thumbDir . $thumbPrefix . $new_filename . '.' . $extension, $thumbWidth, $thumbHeight, $thumbQuality)

            &&

            resize($uploadDir . $new_filename . '.' . $extension, $resizeDir . $resizePrefix . $new_filename . '.' . $extension, $resizeWidth, $resizeHeight, $resizeQuality)

            ){

              echo '<h3 style="color:green;">File ('.$new_filename . '.' . $extension.') uploaded, resized and thumbed succesfully</h3>';

          }else{

            echo '<h3 style="color:red;">File ('.$new_filename . '.' . $extension.') uploaded succesfully, but resize and thumb failed</h3>';

        }

      }else{

        echo '<h3 style="color:red;">Error - unable to upload file: '.basename($_FILES['myFile']['name']).'</h3>';

      }

    }else{

      echo '<h3 style="color:red;">Wrong filetype, allowed filetypes are: ('.implode(',',$allowedFileTypes).')</h3>';

    }

  }else{

    echo '<h3 style="color:red;">No file selected<h3>';

  }

}

?>

    <form action="" method="post" enctype="multipart/form-data">

      <div>File (<?=implode(',',$allowedFileTypes)?>): <input type="file" name="myFile"></div>

      <div><input type="submit" name="myUpload" value="Upload file"></div>
Avatar billede repox Seniormester
03. januar 2011 - 14:55 #6
Det er et problem med dine rettigheder på filen - ikke noget PHP relateret.

Ved at CHMOD'e mappen 'resize' til 777, burde du ikke have noget problem.
Avatar billede gqo Nybegynder
03. januar 2011 - 16:23 #7
Hej, ja chmod glemte jeg på denne mappe, sorry, så det virker, så alt er godt, men er der noget mere enkelt der kun gør som fortalt i spørgsmål nr.5? ellers mange tak for hjælpen. Gert
Avatar billede repox Seniormester
17. januar 2011 - 11:29 #8
Hvorfor accepterede du dit eget svar? Var der ikke noget brugbart fra os andre?

Og nej; der er ikke noget enkelt ved det du forespørger...
Avatar billede gqo Nybegynder
18. januar 2011 - 20:18 #9
Hej sorry, det var nok fordi jeg ikke lukkede spørgsmålet korrekt, der var absalut mange gode svar, som var brugbare..endnu engang tak, <
Gert,
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester