Avatar billede 1409 Praktikant
16. oktober 2007 - 11:51 Der er 3 kommentarer og
1 løsning

Upload: Thumbs med fast højde og relativ bredde

Nedestående er et fungerende upload-script, der tjekker for fil-type, størrelse etc., genererer thumbnails, lægger filerne i de respektive dirs osv.
Men som det er nu beregnes størrelsen på thumbs udfra en procent-sats.
Hvordan ændre jeg det til, at thumbs får en fast højde på 100 pixel og en bredde relativ til denne højde? Altså fx. hvis originalen er 400 h * 800 b bliver thumb 100 * 200?

/* -- -- -- -- Tilføj billede -- -- -- -- */
IF(isset($_POST['ins_pict'])) {

    function make_thumbnail($filename, $thumbs_dir, $percent = 0.5){
        // her der får du fat i højde og bredde af billedet og skalerer disse værdier:
        list($width, $height) = getimagesize($filename);
        $newwidth = $width * $percent;
        $newheight = $height * $percent;
        // imagecreatetruecolor() laver et nyt resource-object i
        // PHP, en speciel PHP datatype som bruges når man bruger
        // GD lib. $thumb er altså en resource som indeholder
        // en ren data-struktur til et nyt billede - det nye thumbnail
        // billede. Imagecreatefromjpeg() indlæser dit billede
        // som var det JPEG. Her forventes et JPEG billed. Der
        // findes funktioner til indlæsning af andre billede
        // formater. $source er et resource-object som
        // nu indeholder det uploadede billed:
        $thumb = imagecreatetruecolor($newwidth, $newheight);
        $source = imagecreatefromjpeg($filename);

        // Magien ligger i at bruge imagecreateresized().
        // Den modtager de to resource-objekter,
        // pixel koordinater i destination og kilde-billedet (her begge 0,0)
        // og de nye og gamle billede størelser.
        // Det den gør er simpelthen at lave en ny skaleret kopi
        // af det som ligger i $source og gemme det i $thumb.
        imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
       
        // Her gemmes thumbnail billedet:
        imagejpeg($thumb, $thumbs_dir.'thumb_'.basename($filename));
    }

    $pComment=$_POST['pComment'];
    $sId=$_POST['sId'];
    $cId=$_POST['cId'];
   
    $allowedTypes = array("image/jpeg", "image/pjpeg", "image/jpg"); //tilladte filtyper
    $maxFileSize = 40960; //tilladt max-størrelse i bytes
    $maxImgWidth = 400; //tilladt max-bredde i pixels
//    $path = "/customers/xx/yy/httpd.www/grafik/bands/";//*nix-path til filens endelige placering
    $temppath = "C:\\xampp\\htdocs\\tempup\\";//win-temppath
    $path1 = "C:\\xampp\\htdocs\\nikolai\\grafik\\fotos\\";//win-path1
    $pathThumb = "C:\\xampp\\htdocs\\nikolai\\grafik\\fotos\\fotosthumbs\\";//win-path2
   
    IF($_FILES['img']['size']> 0) {
        /* -- -- hvis img-input-feltet er ok -- -- */
       
        //Er fil-typen blandt tilladte?
        IF (in_array($_FILES['img']['type'],$allowedTypes)) {
       
            //Er filen-størrelsen under max. tilladt?
            IF ($_FILES['img']['size'] <= $maxFileSize) {
           
                //Hvad er bredden på billedet?
                $size = getImageSize($_FILES['img']['tmp_name']);
                list($foo, $width, $bar, $height) = explode("\"",$size[3]);
               
                //Er billede-bredden under max.?
                IF ($width <= $maxImgWidth) {
                   
                    //Læseligt tidsstempel - tilføjes senere filnavn
                    $timeStamp = date("His_dmy", time());
                   
                    //Overføre billede til specificeret dir - win-funktion
                    chdir($path);//win-funktion
                    $img = stripslashes ($img);//win-funktion
                   
                    //omdøb fil med tidsstempel
                    $name = strtolower($_FILES['img']['name']);
                    $ext = pathinfo($name);
                    $filtype = $ext['extension']; // FILTYPEN
                    $newname = $timeStamp .".". $filtype;
                   
                    //Flytte fil til endelig placering
                    move_uploaded_file($_FILES['img']['tmp_name'], $path1.$newname) or die("Desværre er der sket en fejl!");
                   
                    // THUMBNAIL BLIVER LAVET HER:
                    make_thumbnail($curDir . $path1 . $newname,$curDir . $pathThumb,0.5);
                   
                    //Kobler til og opdatere db
                    MYSQL_CONNECT($host,$user,$password) OR DIE($c_error);
                    MYSQL_SELECT_DB($database) OR DIE($s_error);
                   
                    $query = MYSQL_QUERY("INSERT INTO picture (pUrl, pComment, sId, cId)".
                    "VALUES ('$newname','$pComment','$sId','$cId') ");
                    $mess = "Foto sat ind!";
                }
                ELSE {
                    //Fejlmedl. hvis bild. breddere end tilladt
                    $mess = "Foto <I>ikke</I> sat ind: Det er bredere end tilladt!";
                }
            }
            ELSE {
                //Fejlmedl. hvis fil over max. tilladt
                $mess = "Foto <I>ikke</I> sat ind: Filen er for stor!";
            }
        }
        ELSE {
            //Fejlmedl. hvis fil-format ikke tilladt
            $mess = "Foto <I>ikke</I> sat ind: Forkert fil-format!";
        }
    }
    ELSE {
        //Fejlmedl. hvis input-felt tomt
        $mess = "Foto <I>ikke</I> sat ind: Ingen fil specificeret!";
    }
    Header("Location:serie.php?serie=$sId&cId=$cId&mess=$mess");
}

Btw. er noget af det herfra: http://www.eksperten.dk/spm/745567 :-)
På forhånd tak
Avatar billede terrak Nybegynder
16. oktober 2007 - 12:23 #1
$newwidth = $width * $percent;
$newheight = $height * $percent;

laves om til:

$ratio = 100 / $height;
$newheight = $ratio * $height;
$newwidth = $ratio * $width;
Avatar billede terrak Nybegynder
16. oktober 2007 - 12:28 #2
Du kan også indbygge den i din funktion ved at sige:

function make_thumbnail($filename, $thumbs_dir, $maxthumbheight = 100){
..
..

$ratio = $maxthumbheight / $height;
$newheight = $ratio * $height;
$newwidth = $ratio * $width;

..
..
}
Avatar billede 1409 Praktikant
16. oktober 2007 - 13:22 #3
Tusind tak!
Læg et svar for de velfortjente point

Nu virker det efter hensigten, og jeg har tilføjet at thumbnail-navnet tilføjes til DB'en.

Men en enkel detalje, som jeg undre mig over:
I følgende angiver 0.5 da til kvaliteten af thumbnail (så vidt jeg ved), men selv hvis jeg ændre det til 0.1, så sker der alligevel ikke noget med kvaliteten...
make_thumbnail($curDir . $path1 . $newname,$curDir . $pathThumb,0.5);


Her er iøvrigt hele scriptet, hvis andre kan bruge det:

/* -- -- -- -- Tilføj billede -- -- -- -- */
IF(isset($_POST['ins_pict'])) {

    function make_thumbnail($filename, $thumbs_dir){
        // her der får du fat i højde og bredde af billedet og skalerer disse værdier:
        list($width, $height) = getimagesize($filename);
        $ratio = 100 / $height;
        $newheight = $ratio * $height;
        $newwidth = $ratio * $width;

        // imagecreatetruecolor() laver et nyt resource-object i
        // PHP, en speciel PHP datatype som bruges når man bruger
        // GD lib. $thumb er altså en resource som indeholder
        // en ren data-struktur til et nyt billede - det nye thumbnail
        // billede. Imagecreatefromjpeg() indlæser dit billede
        // som var det JPEG. Her forventes et JPEG billed. Der
        // findes funktioner til indlæsning af andre billede
        // formater. $source er et resource-object som
        // nu indeholder det uploadede billed:
        $thumb = imagecreatetruecolor($newwidth, $newheight);
        $source = imagecreatefromjpeg($filename);

        // Magien ligger i at bruge imagecreateresized().
        // Den modtager de to resource-objekter,
        // pixel koordinater i destination og kilde-billedet (her begge 0,0)
        // og de nye og gamle billede størelser.
        // Det den gør er simpelthen at lave en ny skaleret kopi
        // af det som ligger i $source og gemme det i $thumb.
        imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
       
        // Her gemmes thumbnail billedet:
        imagejpeg($thumb, $thumbs_dir.'thumb_'.basename($filename));
    }

    $pComment=$_POST['pComment'];
    $sId=$_POST['sId'];
    $cId=$_POST['cId'];
   
    $allowedTypes = array("image/jpeg", "image/pjpeg", "image/jpg"); //tilladte filtyper
    $maxFileSize = 40960; //tilladt max-størrelse i bytes
    $maxImgWidth = 400; //tilladt max-bredde i pixels
//    $path = "/customers/xx/yy/httpd.www/grafik/bands/";//*nix-path til filens endelige placering
    $temppath = "C:\\xampp\\htdocs\\tempup\\";//win-temppath
    $path1 = "C:\\xampp\\htdocs\\nikolai\\grafik\\fotos\\";//win-path1
    $pathThumb = "C:\\xampp\\htdocs\\nikolai\\grafik\\fotos\\fotosthumbs\\";//win-path2
   
    IF($_FILES['img']['size']> 0) {
        /* -- -- hvis img-input-feltet er ok -- -- */
       
        //Er fil-typen blandt tilladte?
        IF (in_array($_FILES['img']['type'],$allowedTypes)) {
       
            //Er filen-størrelsen under max. tilladt?
            IF ($_FILES['img']['size'] <= $maxFileSize) {
           
                //Hvad er bredden på billedet?
                $size = getImageSize($_FILES['img']['tmp_name']);
                list($foo, $width, $bar, $height) = explode("\"",$size[3]);
               
                //Er billede-bredden under max.?
                IF ($width <= $maxImgWidth) {
                   
                    //Læseligt tidsstempel - tilføjes senere filnavn
                    $timeStamp = date("His_dmy", time());
                   
                    //Overføre billede til specificeret dir - win-funktion
                    chdir($path);//win-funktion
                    $img = stripslashes ($img);//win-funktion
                   
                    //omdøb fil med tidsstempel
                    $name = strtolower($_FILES['img']['name']);
                    $ext = pathinfo($name);
                    $filtype = $ext['extension']; // FILTYPEN
                    $newname = $timeStamp .".". $filtype;
                   
                    //Flytte fil til endelig placering
                    move_uploaded_file($_FILES['img']['tmp_name'], $path1.$newname) or die("Desværre er der sket en fejl!");
                   
                    // THUMBNAIL BLIVER LAVET HER:
                    make_thumbnail($curDir . $path1 . $newname,$curDir . $pathThumb,0.9);
                   
                    //Lav pThumbUrl til db
                    $pThumbUrl = 'thumb_' . $newname;
                   
                    //Kobler til og opdatere db
                    MYSQL_CONNECT($host,$user,$password) OR DIE($c_error);
                    MYSQL_SELECT_DB($database) OR DIE($s_error);
                   
                    $query = MYSQL_QUERY("INSERT INTO picture (pUrl, pThumbUrl, pComment, sId, cId)".
                    "VALUES ('$newname','$pThumbUrl','$pComment','$sId','$cId') ");
                    $mess = "Foto sat ind!";
                }
                ELSE {
                    //Fejlmedl. hvis bild. breddere end tilladt
                    $mess = "Foto <I>ikke</I> sat ind: Det er bredere end tilladt!";
                }
            }
            ELSE {
                //Fejlmedl. hvis fil over max. tilladt
                $mess = "Foto <I>ikke</I> sat ind: Filen er for stor!";
            }
        }
        ELSE {
            //Fejlmedl. hvis fil-format ikke tilladt
            $mess = "Foto <I>ikke</I> sat ind: Forkert fil-format!";
        }
    }
    ELSE {
        //Fejlmedl. hvis input-felt tomt
        $mess = "Foto <I>ikke</I> sat ind: Ingen fil specificeret!";
    }
    Header("Location:serie.php?serie=$sId&cId=$cId&mess=$mess");
}
Avatar billede terrak Nybegynder
16. oktober 2007 - 13:47 #4
Din funktion, make_thumbnail(), kræver kun 2 argumenter ($filename og $thumbs_dir). De 0.5 du sender med bliver ikke brugt til noget.

For at ændre kvaliteten af thumbnail billedet skal du have fat i linjen
imagejpeg($thumb, $thumbs_dir.'thumb_'.basename($filename));
hvor et tredje argument angiver kvaliteten ( http://dk2.php.net/imagejpeg ).

F.eks.:

imagejpeg($thumb, $thumbs_dir.'thumb_'.basename($filename), 90);

Nu er kvaliteten sat til 90 (0-100 hvor 100 er bedste kvalitet og største fil).
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