Avatar billede tlunde Nybegynder
20. januar 2008 - 20:50 Der er 30 kommentarer og
1 løsning

Resize billede inden upload

Hejsa,
Jeg har lavet et billedgalleri, hvor der hovedsageligt er 3 steps der skal ske i billedupload delen til galleriet.

1. Jeg renamer billedet til en random streng.
2. Billedet skal kopieres fra en folder til en anden.
3. Jeg skal have ændret billedstørrelsen på de uploadede billeder.

Det er step 3, hvor jeg har et problem.
Jeg har prøvet at stykke dette kode sammen i en funktion, som jeg kalder på billedet, efter det er uploadet.

function resizeImage($x,$y,$billede) {
    $imgsize = GetImageSize($billede);
    if (($imgsize[0] > $x) || ($imgsize[1] > $y)) {
        $tmpimg = tempnam("/tmp", "MKUP");
        system("djpeg $billede >$tmpimg");
        system("pnmscale -xy $x $y $tmpimg | cjpeg -smoo 10 -qual 50 >$billede");
        unlink($tmpimg);
    }
}

Og denne funktion bliver kaldt her:
resizeImage(125,125,$targetfile1);

Gør jeg noget forkert i min funktion?
Er det forkert at jeg først vil ændre billedstørrelsen efter det er kopieret ud i de to foldere?

Er der en nemmere måde på det, end det jeg har gang i lige nu?
Avatar billede jakobdo Ekspert
20. januar 2008 - 21:15 #1
Prøv at kig på denne funktion: http://www.eksperten.dk/artikler/1130

Den er lavet kun til at resize!
Jeg ville lave resize og kopier til mapperne i samme hug!
Avatar billede tlunde Nybegynder
21. januar 2008 - 08:38 #2
Den ser fin ud den kode, men hvilke parameter skal jeg smide med over i forhold til det kode jeg har?
Avatar billede tlunde Nybegynder
21. januar 2008 - 08:47 #3
Sådan som den er nu, der ser den jo sådan ud:
function resize( $filename, $newfilename, $maxw, $maxh, $quality=85 )

Hvad skal jeg sende med der mere end jeg allerede gør?
Tænker mest på om $filename skal have den komplette sti med over til billedet?
Og hvad indeholder $newfilename?
Avatar billede jakobdo Ekspert
21. januar 2008 - 08:49 #4
$filename = filnavnet på den fil som skal resizes.
$newfilename = det nye filnavn på filen efter den er resizet.
$maxw = max bredde
$maxh = max højde
$quality = kvalitet fra 0 - 100 (100 = bedst)
Avatar billede tlunde Nybegynder
21. januar 2008 - 09:55 #5
Og var $filename den komplette sti til billedet?
Er det dglib funktioner der bliver brugt igennem resize-scriptet?
Avatar billede jakobdo Ekspert
21. januar 2008 - 10:02 #6
gdlib bruges ja.
Du kan bruge den fulde sti, men du kan også bruge relative sti.
Avatar billede tlunde Nybegynder
21. januar 2008 - 10:05 #7
hmm...okay.
gdlib er det noget man selv skal installere på serveren, eller er det hosten der skal det? I dette tilfælde Surftown?
Kan man selv tjekke om de har gdlib installeret?
Avatar billede jakobdo Ekspert
21. januar 2008 - 10:12 #8
du kan tjekke det med:
<?php
phpinfo();
?>

Og jeg vil med 99,9 % sikkerhed mene Surftown har det aktivt.
Avatar billede tlunde Nybegynder
21. januar 2008 - 10:17 #9
Jeg prøver lige at tjekke med det stykke kode...
Avatar billede tlunde Nybegynder
21. januar 2008 - 10:19 #10
Har lige smidt filen her:
http://www.marieogthomas.dk/phpinfo.php

Men kan ikke lige finde hvor jeg skal se om der er gdlib installeret...
Avatar billede jakobdo Ekspert
21. januar 2008 - 11:07 #11
Du kan også teste koden på denne side: http://dk.php.net/imagecreatetruecolor
Avatar billede tlunde Nybegynder
21. januar 2008 - 11:14 #12
Når jeg kører koden:
<?php
header ("Content-type: image/png");
$im = @imagecreatetruecolor(120, 20)
      or die("Cannot Initialize new GD image stream");
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5,  "A Simple Text String", $text_color);
imagepng($im);
imagedestroy($im);
?>

her:
http://www.marieogthomas.dk/test.php

Så kommer den frem med et billede, som den viser på php.net.
Vil det sige at gdlib er installeret hos surftown?
Avatar billede jakobdo Ekspert
21. januar 2008 - 11:17 #13
Det vil sige det er ok! :o)
Avatar billede tlunde Nybegynder
21. januar 2008 - 11:25 #14
okay, prøver lige at anvende dit script så, og ser om jeg kan få det til at virke :-)
Avatar billede tlunde Nybegynder
21. januar 2008 - 12:01 #15
Nu har jeg lige prøvet din funktion, men det ser ikke rigtigt ud til at den resizer billedet jeg uploader.

Jeg har skrevet i min kode:
$destination1 = "upload/galleri/pic_small/";
$billede = $random.".".$fileext;
$targetfile1 = $destination1.$billede;

resize($targetfile1, $billede, 175, 175);
resize($targetfile2, $billede, 550, 550);

Men den smider stadig billedet op i sin oprindelige størrelse.
Gør jeg noget forkert?
Avatar billede jakobdo Ekspert
21. januar 2008 - 13:20 #16
Jeg vil gætte på du skal bytte rundt på $targetfile1 og $billede.
Jeg vil gætte på du skal bytte rundt på $targetfile2 og $billede.
Avatar billede tlunde Nybegynder
21. januar 2008 - 13:37 #17
Virker desværre heller ikke rigtigt...
Avatar billede jakobdo Ekspert
21. januar 2008 - 15:43 #18
Hvad får du af fejl?
Avatar billede tlunde Nybegynder
21. januar 2008 - 15:47 #19
Får ingen fejl, den resizer bare ikke de billeder jeg smider efter den.
Det samme problem havde jeg med det oprindelige script jeg havde.
Avatar billede jakobdo Ekspert
21. januar 2008 - 17:22 #20
Prøv helt basic!
Opret en mappe: test
chmod mappen til: 777
Smid din php kode ind i mappen.
Smid et jpg billede i samme mappe.
Kald så din php kode, noget i stil med:

<?php
//PHP KODE
resize('billede.jpg','resized_billede.jpg',100,100);
?>
Avatar billede tlunde Nybegynder
21. januar 2008 - 19:24 #21
Nu har jeg lige prøvet at gøre det du skriver, og det virker faktisk, men hvorfor kan jeg ikke lige regne ud?

SKAL den kode ligge i samme mappe som billederne?

Som jeg har det nu, så har jeg mine uploadede billeder i disse to foldere:
upload/galler/pic_small
upload/galler/pic_large

og min resize function ligger i roden af min webhotel i filen functions.php.
Er det så forkert at den ligger der? SKAL den ABSOLUT ligge i samme folder som billederne?
Avatar billede jakobdo Ekspert
21. januar 2008 - 19:48 #22
Nej, den skal ikke nødvendigvis ligge i samme mappe.
Men har du husket at CHMOD'e mapperne?
Avatar billede tlunde Nybegynder
21. januar 2008 - 19:50 #23
Min kode der håndtere upload af billede ser sådan her ud:
$sql = "INSERT INTO gallerier_billeder (galleri_id, kommentar, dato, aktiv) VALUES ('".$_REQUEST['kategori_id']."', '".addslashes($_REQUEST['billed_tekst'])."', '".time()."', 'ja')";
    mysql_db_query($dbName, $sql);
    $last_id = mysql_insert_id();
   
    if ($_FILES['billede']['name'] != "") {
           
        $filnavn = $_FILES['billede']['name'];
        $filnavn_array = explode(".", $filnavn);
        $fileext = $filnavn_array[count($filnavn_array)-1];
   
        ## Kun 3 følgende fileextensions er tilladte: jpg, jpeg og gif
        if ($fileext == "jpg" || $fileext == "JPG") {
            ## Henter billedet der skal uploades
            $billede = $_FILES['billede']['name'];
           
            ## Opretter de 2 biblioteker hvori billederne skal placeres
            $destination1 = "upload/galleri/pic_small/";
            $destination2 = "upload/galleri/pic_large/";
           
            ## Omdøber billedfilerne, hvis de indeholder ukorrekte tegn
            $random     = "";
            $keychars1     = "abcdefghijklmnopqrstuvwxyz123456789";
            while (strlen($random) < 15) {
                $random .= substr($keychars1, rand(0, strlen($keychars1)-1), 1);
            }
            $billede = $random.".".$fileext;
            $billede2 = $random."_re.".$fileext;
           
            ## Opretter en streng med hele stien til billederne
            $targetfile1 = $destination1.$billede;
            $targetfile2 = $destination2.$billede;
           
            ## Flytter det uploadede billede til den første folder
            move_uploaded_file($_FILES['billede']['tmp_name'], $targetfile1);
           
            ## Kopiere billedet fra den ene folder til den anden folder
            copy($targetfile1, $targetfile2);
           
            ## Ændre størrelsen på de 2 billeder, så de passer efter ønsket
            resize($targetfile, $billede2, 175, 175);
            resize($targetfile2, $billede2, 550, 550);
           
            $sql = "UPDATE gallerier_billeder SET filnavn = '$billede' WHERE id = '$last_id'";
            mysql_db_query($dbName, $sql);
        }
    }
    header("location: ".$_SERVER['PHP_SELF']."");

og mine billeder bliver uploadet til:
upload/galleri/pic_small
upload/galleri/pic_large

og min resize kode ligger i functions.php, og det er denne kode:
function resize($filename, $newfilename, $maxw, $maxh, $quality=85) { 
    $ext = strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) ); 
   
    switch($ext)  {   
        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($ext)  {   
        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( $srcim, $newfilename, $png_q );     
            break;   
        default:     
            return false; 
    } 
   
    imagedestroy( $dstim ); 
    imagedestroy( $srcim ); 
   
    return file_exists($newfilename);
}

Kan du måske se hvad det er der går galt?
For dit eksempel virkede jo godt nok, når jeg lagde det hele i samme fil og i samme mappe som billedet, så virkede det jo fint nok...

Hvad gør jeg forkert?
Avatar billede tlunde Nybegynder
21. januar 2008 - 19:51 #24
Ja, mapperne er CHMOD'et, for det alm upload fungere jo fint, bare at den ikke resizer efter de er uploadet.
Avatar billede jakobdo Ekspert
21. januar 2008 - 21:41 #25
Prøv at brug relative stier til uploaded filer:

resize('billede.jpg','upload/galler/pic_small/small_billede.jpg',100,100);
resize('billede.jpg','upload/galler/pic_large/large_billede.jpg',800,800);
Avatar billede tlunde Nybegynder
22. januar 2008 - 09:10 #26
Hej igen,
Nu ser det ud til at virke. Har nu skrevet sådan her:
resize('upload/galleri/pic_small/'.$filnavn,'upload/galleri/pic_small/'.$filnavn,175,175);
resize('upload/galleri/pic_large/'.$filnavn,'upload/galleri/pic_large/'.$filnavn,550,550);

Men lige en ting mere. Kan det ikke lade sig gøre at ændre scriptet således, at det kun tager højde for bredden af billedet? således at mine billeder eks. altid bliver 175 og 550 i bredden, så den ikke kigger på højden af billedet?

Sådan er det nemlig nu, og det giver ret mange uens billeder i oversigten...
Avatar billede jakobdo Ekspert
22. januar 2008 - 22:07 #27
Jeg har engang lavet det jo.
Men har det ikke lige ved hånden nu.
Prøv at søg lidt på eksperten, der har jeg lavet noget lign .tidligere.
Avatar billede tlunde Nybegynder
09. februar 2008 - 11:11 #28
Har fået det hele til at virke, og du skal selvfølgelig have dine point :-)
Smider du lige et svar?

Har lige oprettet et spørgsmål om en kalender jeg er ved at lave, måske du lige kan kigge lidt på den opgave også? :-)
Avatar billede jakobdo Ekspert
09. februar 2008 - 17:32 #29
Svar!
Avatar billede tlunde Nybegynder
10. februar 2008 - 09:58 #30
Værgso, er her dine velfortjente point :-)
Måske du kunne have lyst til at hjælpe mig med denne opgave også:
http://www.eksperten.dk/spm/818707 :-)
Avatar billede jakobdo Ekspert
10. februar 2008 - 16:54 #31
Takker for point.
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