Lage Thumbnails av bilder som lastes opp?

En tråd i 'PHP, SQL og databaser' startet av Mr Vest, 13 Sep 2009.

  1. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    Jeg aner virkelig ikke helt hvordan dette her funker, men hvordan lager man Thunbnails av bilder som blir lastet opp? Er dette noe jeg i det hele tatt kan gjøre med PHP?

    Scriptet jeg bruker i dag laster opp filer til server, gir dem ett nytt navn, men lager ikke noen som helst thumbs av dem. Det sluker jo mildt sagt enormt med båndbredde og vise gjerne 30 bilder a 500KB på en og samme sidevisning. Jeg husker virkelig ikke hvor jeg fant dette scriptet, men kunne noen av dere være kul med meg og fortelle hva jeg må gjøre for og også lage thumbnails av bildene dette scriptet laster opp? :)

    PHP:
    <?
    //define a maxim size for the uploaded images in Kb
     
    define ("MAX_SIZE","10000"); 

    //This function reads the extension of the file. It is used to determine if the file  is an image by checking the extension.
     
    function getExtension($str) {
             
    $i strrpos($str,".");
             if (!
    $i) { return ""; }
             
    $l strlen($str) - $i;
             
    $ext substr($str,$i+1,$l);
             return 
    $ext;
     }

    //This variable is used as a flag. The value is initialized with 0 (meaning no error  found)  
    //and it will be changed to 1 if an errro occures.  
    //If the error occures the file will not be uploaded.
     
    $errors=0;
    //checks if the form has been submitted
     
    if(isset($_POST['Submit'])) 
     {
         
    //reads the name of the file the user submitted for uploading
         
    $image=$_FILES['image']['name'];
         
    //if it is not empty
         
    if ($image
         {
         
    //get the original name of the file from the clients machine
             
    $filename stripslashes($_FILES['image']['name']);
         
    //get the extension of the file in a lower case format
              
    $extension getExtension($filename);
             
    $extension strtolower($extension);
         
    //if it is not a known extension, we will suppose it is an error and will not  upload the file,  
        //otherwise we will do more tests
     
    if (($extension != "jpg") && ($extension != "jpeg") && ($extension != "png") && ($extension != "gif")) 
             {
            
    //print error message
                 
    echo '<h1>Unknown extension!</h1>';
                 
    $errors=1;
             }
             else
             {
    //get the size of the image in bytes
     //$_FILES['image']['tmp_name'] is the temporary filename of the file
     //in which the uploaded file was stored on the server
     
    $size=filesize($_FILES['image']['tmp_name']);

    //compare the size with the maxim size we defined and print error if bigger
    if ($size MAX_SIZE*1024)
    {
        echo 
    '<h1>You have exceeded the size limit!</h1>';
        
    $errors=1;
    }

    //we will give an unique name, for example the time in unix time format
    $image_name=time().'.'.$extension;
    //the new name will be containing the full path where will be stored (images folder)
    $newname="images/".$image_name;
    //we verify if the image has been uploaded, and print error instead
    $copied copy($_FILES['image']['tmp_name'], $newname);
    if (!
    $copied
    {
        echo 
    '<h1>Copy unsuccessfull!</h1>';
        
    $errors=1;
    }}}}

    //If no errors registred, print the success message
     
    if(isset($_POST['Submit']) && !$errors
    {
    echo 
    "
    Bildet er slengt opp. Dritkult!
    <br><br>
    <img src=\"hxxp://domene.com/
    $newname\" width=\"250\">
    <br><br>
    <h1 class=\"stortittel\">Laste opp enda ett bilde?</h1>
    "
    ;
     }
    ?>
    Tar gjerne også imot tips til andre småscript som kan gjøre jobben. :) Takk.!
     
  2. hansvh

    hansvh Medlem

    Innlegg:
    165
    JPEG har innebygd støtte for integrerte thumbnails. Er det aktuelt for deg å huke av i GIMP/Photoshop for at du vil legge ved thumbnail eller brukes uploaden også av brukere og slikt?

    Script som henter ut thumbs fra den store varianten er på et par linjer hvis det er aktuelt. Når jeg tenker meg om så er det vel egentlig ganske enkelt å nedskalere det store bildet og lagre thumb til fil også. Dette har jeg dog ikke klart liggende.

    http://us3.php.net/manual/en/function.imagecopyresampled.php er en aktuell funksjon for nedskalering.
     
    Pong liker dette.
  3. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    Jeg er nok redd for at også brukere / andre enn meg selv laster opp bilder. Dessuten blir også GIF og PNG lastet opp med scriptet. Derfor er nok løsning med og legge ved en slik thumbnail ikke så nyttig. :(

    Vil det og vise thumbnail fra orginalbildene sørge for at ikke orginalbildet blir lastet ned av de som kun skal se en thumb? (Tenker på det scriptet du nevner med ett par linjer.)

    Når jeg leser på linken finner jeg ett ukjent ord. Hva betyr "resample" ? F.eks "This example will resample an image to half its original size." ?
     
  4. tyr897

    tyr897 Medlem

    Innlegg:
    402
    Resample betyr i denne sammenheng ganske enkelt å forandre dimensjonene på bildet, som er akkurat hva du ønsker å gjennomføre.

    "resample an image to half its original size" betyr dermed rett og slett å gjøre bildet halvparten så stort (i piksler)
     
    Mr Vest liker dette.
  5. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    Neida, jeg vil ikke forande dimensjonene på bildene. Jeg vil bare lage en kopi av bildet når det lastes opp og denne kopien skal da altså være en liten thumbnail.
     
  6. Uregistrert Guest

    Og da forandrer du dimensjonene, og lagrer bildet et annet sted.
    Når du åpner bildet og resampler, er resultatet bare en ressurs, du har ikke endret originalen - du kan selve velge hvor og i hvilket format du ønsker å lagre bildet.
     
  7. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    Jammen Uregistrert, jeg trenger da ikke få fortalt en gang til hva jeg ønsker og utrette. Det er hvordan jeg kan gjøre det jeg undrer meg på.
     
  8. tyr897

    tyr897 Medlem

    Innlegg:
    402
    Forrige post var min, brukte visst et annet browservindu som ikke var logget inn.

    Altså, du fikk forklart ordet du ønsket en forklaring på, men misforstod konteksten - jeg gav deg da en litt mer utfyllende forklaring.

    Eksempelet i manualen (imagecopyresampled) viser nøyaktig hva du ønsker å utrette, med unntak av at du må gi et filnavn til imagejpeg og droppe headeren.
    Jeg kan selvsagt skrive kodesnutten til deg, men av dine andre tråder har jeg fått inntrykk av at du ønsker å utvikle deg som koder, og dersom det er tilfelle, vil det være å gjøre deg en bjørnetjeneste. Beklager dog om jeg var litt for diffus i min uttrykksmåte.
     
  9. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    Jeg var nok litt krass i svaret mitt også, beklager det. Har sittet her og revet hodet av meg på noe Wordpress-skit litt for lenge. Er i en fase hvor jeg snart kategoriserer Wordpress som et hat-objekt. Men nok om det... :)

    Altså, gi et filnavn til imagejpeg? Hvordan kan jeg gjøre det? Jeg forstår ikke eksempelet så veldig bra faktisk... Egentlig tror jeg det er 2 ting jeg ikke forstår med hele eksempelet nå, og det er altså:

    1:
    Når jeg kikker øverst i eksempelet så finner jeg $filename. Kan denne inneholde sti til bildet dersom bildet finnes i en annen mappe? f.eks /images/storebilder/123.jpg? Eller kan den kun inneholde filnavnet? Hva kan jeg evt gjøre dersom filen befinner seg ett annet sted?

    2:
    Hva mener du med og gi filnavn til imagejpeg? Er det noe med imagejpeg($image_p, null, 100); jeg må gjøre der?

    Utvikle meg som koder ja. En skummel tanke akkurat nå, men det skal jo bli spennende og se hva for noen snodige kunnskaper jeg sitter på om noen hundre år. :)
     
  10. Thomas Pedersen

    Thomas Pedersen Pornogründer

    Innlegg:
    632
    1. $filename kan være sti til bildet, eller bare filnavnet, hvis filen ligger i samme mappe som scriptet.
    2. der det står null må du skrive hvor du vil at bildet skal lagres.

    her er en funksjon jeg pleier å bruke.

    PHP:
        function userCrop($srcThumb,$destThumb,$co=array(),$ext='',$delOrg=FALSE) {
            if(empty(
    $co)){
                return 
    FALSE;
            }
            if(
    strtolower($ext)=='.jpg'){
                
    $newimage imagecreatefromjpeg($srcThumb);
            }elseif(
    strtolower($ext)=='.gif'){
                
    $newimage imagecreatefromgif($srcThumb);
            }elseif(
    strtolower($ext)=='.png'){
                
    $newimage imagecreatefrompng($srcThumb);
            }
            if(!
    $newimage){
                return 
    FALSE;
            }
            
    $newthumb imagecreatetruecolor($co['dest_width'],$co['dest_height']);
            
    imagecopyresampled($newthumb,$newimage,0,0,$co['x1'],$co['y1'],$co['dest_width'],$co['dest_height'],$co['width'],$co['height']);
            if(
    strtolower($ext)=='.jpg'){
                
    imagejpeg($newthumb,$destThumb,90); 
            }elseif(
    strtolower($ext)=='.gif'){
                
    imagegif($newthumb,$destThumb,90); 
            }elseif(
    strtolower($ext)=='.png'){
                
    imagepng($newthumb,$destThumb,90); 
            }
            if(
    $delOrg){
                @
    unlink($srcThumb);
            }
            
    imagedestroy($newimage);
            
    imagedestroy($newthumb);
            return 
    TRUE;    
        }
     
  11. Pong

    Pong Jeg selger sʇɥƃıluʍop :)

    Innlegg:
    3.459
    Såvidt jeg så resizer ikke kodesnutten din bildet, bare laster den opp.
    Hvis du etterpå kjører denne:

    function resizeImage( $source, $target, $width, $height ) {
    // Get new dimensions
    $finfo = @getimagesize( $source );
    if( $finfo[0] != "" ) {
    $width_orig = $finfo[0];
    $height_orig = $finfo[1];
    $ratio_orig = $width_orig / $height_orig;
    if( $width/$height > $ratio_orig ) {
    $width = $height*$ratio_orig;
    } else {
    $height = $width/$ratio_orig;
    }
    if( $width > $width_orig && $height > $height_orig ) {
    $width = $width_orig;
    $height = $height_orig;
    }

    // File-type
    $types = array( 'gif','jpg','png','swf','psd','bmp','tiff(intel)','tiff(motorola)','jpc','jp2','jpx','jb2','swc','iff','wbmp','xbm');

    // Read the file
    $unknown = false;
    $image_p = imagecreatetruecolor( $width, $height );
    switch( $finfo[2] ) {
    case 1: $image = imagecreatefromgif( $source ); break;
    case 2: $image = imagecreatefromjpeg( $source ); break;
    case 3: $image = imagecreatefrompng( $source ); break;
    case 15: $image = imagecreatefromwbmp( $source ); break;
    case 16: $image = imagecreatefromxbm( $source ); break;
    default: $unknown = true;
    }

    if( $unknown ) {
    // Just make a copy if $source <> $target
    if( $source != $target ) {

    }
    } else {
    // Resample
    imagecopyresampled( $image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig );

    // Save the image
    imagejpeg( $image_p, $target, 95 );
    imagedestroy( $image_p );
    }
    }
    }

    Heilt heimalaga ein gång.
     
  12. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    Jeg har ikke kikket på koden enda, men finner nok helt sikkert ut av det etter de gode svar jeg fikk. Takk. :)
     
  13. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    Sjå der ja. Flotte greier. Det tok litt tid før jeg fant ut at jeg måtte skrive hele stien inkludert nytt filnavn helt nederst i imagejpeg, men straks jeg fant ut det funker dette som en drøm.!

    Tusen hjertelig takk for alle svar. Om noen har interesse av et forholdsvis enkelt lite script som laster opp bilder og lager thumbnails av dem samtidig får dere bare si ifra. Da kan jeg heller legge det opp her.
     
  14. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    nextri:

    Jeg sitter her og kikker litt på koden din der oppe og finner følgende:

    if(strtolower($ext)=='.jpg'){
    $newimage = imagecreatefromjpeg($srcThumb);
    }elseif(strtolower($ext)=='.gif'){
    $newimage = imagecreatefromgif($srcThumb);
    }elseif(strtolower($ext)=='.png'){
    $newimage = imagecreatefrompng($srcThumb);
    }

    Men hvordan kan denne koden vite hvilken fil den faktisk skal sjekke formatet på?

    Jeg fikk jo dette her til og fungere slik som dette jeg:

    PHP:
    // Litt nyttig informasjon er bra for helsen
    $newlocation="images/album/thumbs/".$image_name;
    $filename $newname;

    // Get new dimensions
    list($width$height) = getimagesize($filename);
    $new_width 250;
    $new_height 150;

    // Resample
    $image_p imagecreatetruecolor($new_width$new_height);
    $image imagecreatefromjpeg($filename);
    imagecopyresampled($image_p$image0000$new_width$new_height$width$height);

    // Output
    imagejpeg($image_p$newlocation100);
    Men denne har jo da altså kun støtte for JPEG. Hva kan jeg gjøre for og sjekke filformatet, og deretter servere riktig kode for de forkjellige? Jeg ser for meg noe slikt som dette:

    PHP:
    // Litt nyttig informasjon er bra for helsen
    $newlocation="images/album/thumbs/".$image_name;
    $filename $newname;

    // Get new dimensions
    list($width$height) = getimagesize($filename);
    $new_width 250;
    $new_height 150;

    // Resample
    $image_p imagecreatetruecolor($new_width$new_height);
    if (
    Filformat er PNG)
    {
    $image imagecreatefrompng($filename);
    }
    else if (
    Filformat er GIF)
    {
    $image imagecreatefromgif($filename);
    }
    else
    {
    $image imagecreatefromjpeg($filename);
    }
    imagecopyresampled($image_p$image0000$new_width$new_height$width$height);

    // Output
    imagejpeg($image_p$newlocation100);
    Men jeg er da altså veldig usikker på hva jeg må skrive i de forkjellige "iffene" for og sjekke hva for et format filene er i. Noen som vet? Er jeg helt på jordet her?
     
    Sist redigert: 14 Sep 2009
  15. Pong

    Pong Jeg selger sʇɥƃıluʍop :)

    Innlegg:
    3.459
    PHP: getimagesize - Manual
    gir deg en array med mer info enn kun størrelsen - den forteller også hva slags type fil bildet er.
     

Del denne siden