Avatar billede tendal Nybegynder
01. februar 2007 - 10:19 Der er 22 kommentarer og
1 løsning

Resize billede

Hej - jeg kan ikke få følgende script til at virke - er der nogen der kan hjælpe?

function makeThumb($til){
//$til = $konfiguration['upload_bibliotek'].$id.'-'.$_FILES['fil']['name'][$i];
        $image = $til;
    $imgsize = getimagesize($image);
    if($imgsize[0] > 200) {
        //sæt det nye billedes bredde til 200,
        //og regn højden ud så propertionerne passer
        $width = 200;
        $height = $imgsize[1] / ($imgsize[0] / 200);

        //lav et nyt, blankt billede
        $dst_img=imagecreatetruecolor($width,$height);

        //åbn kildebilledet
        $src_img=ImageCreateFromJpeg("$image");

        //kopiér og resize kildebilledet over i det nye billede
        ImageCopyResampled($dst_img,$src_img,0,0,0,0,$width,$height,ImageSX($src_img),ImageSY($src_img));

        //lav output til mappen
        ImageJpeg($dst_img, "./filer/billeder/thumbnail/" . $til);
       
        //hvis bredden ikke er over 200px
        } else {

        //åbn kildebilledet og lav output
        $src_img=ImageCreateFromJpeg("$image");
        ImageJpeg($src_img, $til);
        };

        //sæt url'en til billedet
        $imgurl = "./filer/billeder/thumbnail/" . $til;
}
?>
Functionen kaldes i en for løkke hvor filer fra en form uploades. Functionen kaldes først når original billedet er uploadet. Hvis I vil have hele scriptet med, så lad mig høre, så får I bare det
Avatar billede sw_red_6 Nybegynder
01. februar 2007 - 10:28 #1
hvad er det der ikke virker? Får du nogen fejl?
Avatar billede tendal Nybegynder
01. februar 2007 - 10:30 #2
ingen fejl, men der kommer ingen billede i mappen
Avatar billede kinderaeg Nybegynder
01. februar 2007 - 10:35 #3
Jeg går ud fra at $til er navnet på billedet, og du derfor ikke har åbnet billedet, før du førsøger at hente størrelsen på det. Det er nok der du får fejlen. Prøv at åbne billedet før du kører getimagesize:

$image = ImageCreateFromJpeg($til);
Avatar billede tendal Nybegynder
01. februar 2007 - 10:46 #4
Desværre stadigt ikke noget billede i mappen :o(
Avatar billede kinderaeg Nybegynder
01. februar 2007 - 10:54 #5
Har du prøvet at skrive billedet ud til siden direkte eller skrive størrelsen på billedet ud, i din funktion?

$imgsize = getimagesize($image);
print_r($imgsize);
die();
if($imgsize[0] > 200) {
Avatar billede tendal Nybegynder
01. februar 2007 - 11:02 #6
nej det har jeg ikke, men vil da gerne prøve for at se hvad der sker
Avatar billede tendal Nybegynder
01. februar 2007 - 11:04 #7
Ja ok - der er nok noget galt for der udskrives ingenting
Avatar billede kinderaeg Nybegynder
01. februar 2007 - 11:06 #8
Hvad indeholder variablen $til?
Går ud fra at det er det uploadede billedes temp-sti?!?
Avatar billede tendal Nybegynder
01. februar 2007 - 11:10 #9
Jeg poster lige koden hvor functionen kaldes, så kan du se hvad $til er og om det er en forkert variable jeg bruger - altså om jeg hellere skal bruge $fra

for ($i=0; $i<count($_FILES['fil']); $i++){
    //var_dump($_FILES);
    if(strlen($_FILES['fil']['name'][$i]) > 0){
        $filnavn = $_FILES['fil']['name'][$i];
        $filtest = substr($filnavn, -4);
        if ($filtest == '.jpg' || $filtest== '.gif' || $filtest == '.png' && $lavalbum == false){
            $sql= "INSERT INTO billeder (albumid, filnavn) VALUES ('$albumid', '$filnavn')";
            mysql_query($sql) or die("MySQL fejl: " . mysql_error());
            $id= mysql_insert_id();
            $fra = $_FILES['fil']['tmp_name'][$i];
            $til = $konfiguration['upload_bibliotek'].$id.'-'.$_FILES['fil']['name'][$i];
            move_uploaded_file($fra, $til);
            makeThumb($til);
        }   
        else{
            $filerror = 1;
        }
    }
}
Avatar billede kinderaeg Nybegynder
01. februar 2007 - 11:13 #10
Ja, $fra ville være et bedre bud ;)
Avatar billede kinderaeg Nybegynder
01. februar 2007 - 11:16 #11
Og dog, hvis billedet bliver flyttet i funktionen move_uploaded_file, skulle det jo virke fint nok. Får du billedet ind i den ønskede mappe ($til) i fuld størrelse?
Avatar billede tendal Nybegynder
01. februar 2007 - 11:16 #12
ok troede ikke at jeg kunne resize før billedet var uploadet, men det prøver jeg da bare i stedet for så - det er jo ikke verdens største ændring :o)
Avatar billede tendal Nybegynder
01. februar 2007 - 11:24 #13
Ja jeg får billedet ind i original størrelsen i den rette mappe, og selvom jeg har ændret er der ingen forskel - stadig ingen billede i thumb størrelse
Avatar billede sw_red_6 Nybegynder
01. februar 2007 - 11:26 #14
hvordan ser mappestrukturen ud?
problemet kunne ligge i at du placerer filen her:
./filer/billeder/thumbnail/$konfiguration['upload_bibliotek'].$id.'-'.$_FILES['fil']['name'][$i]
Avatar billede kinderaeg Nybegynder
01. februar 2007 - 11:35 #15
function makeThumb($til){
//$til = $konfiguration['upload_bibliotek'].$id.'-'.$_FILES['fil']['name'][$i];
    $imgurl = "./pics/thumbnail/";
  $image = explode('/',$til);
  $imgsize = getimagesize($til);
  if($imgsize[0] > 200) {
    //sæt det nye billedes bredde til 200,
    //og regn højden ud så propertionerne passer
    $width = 200;
    $height = $imgsize[1] / ($imgsize[0] / 200);

    //lav et nyt, blankt billede
    $dst_img=imagecreatetruecolor($width,$height);

    //åbn kildebilledet
    $src_img=ImageCreateFromJpeg($til);

    //kopiér og resize kildebilledet over i det nye billede
    ImageCopyResampled($dst_img,$src_img,0,0,0,0,$width,$height,ImageSX($src_img),ImageSY($src_img));

    //lav output til mappen
    ImageJpeg($dst_img, $imgurl.$image[count($image)-1]);
   
    //hvis bredden ikke er over 200px
  } else {

    //åbn kildebilledet og lav output
    $src_img=ImageCreateFromJpeg($til);
    ImageJpeg($src_img, $til);
  }
}

Det skulle kunne klare det?!?
Avatar billede kinderaeg Nybegynder
01. februar 2007 - 11:36 #16
Du kan så selv ændre $imgurl så den passer med stien til dine thumbnails ;)
Avatar billede tendal Nybegynder
01. februar 2007 - 11:47 #17
yes sir - det virkede - kan godt se hvad der var galt - $til var selvfølgelig hele stien og det var jo kun billedet der skulle bruges
Avatar billede tendal Nybegynder
01. februar 2007 - 11:47 #18
Så et svar er vel på sin plads så der kan uddeles point
Avatar billede kinderaeg Nybegynder
01. februar 2007 - 12:27 #19
Svar :)
Avatar billede tendal Nybegynder
01. februar 2007 - 17:19 #20
Ikke fordi du ikke må få dine point - dem skal du nok få, men jeg er stødt ind i et lille problem. Hvis jeg uploader et billede som er omkring 1 MB så går det galt - har debug'et lidt og fundet frem til at det er denne linie der går galt
$src_img=ImageCreateFromJpeg($til);
Så vidt jeg kan se så er det altså fordi den ikke kan åbne filen til at lave den nye ud fra at den går i stå. Igen kommer der ingen fejl, men den stopper bare og laver en blank side - tror du måske du kan være behjælpelig med en løsning?
Avatar billede kinderaeg Nybegynder
02. februar 2007 - 08:29 #21
Det er fordi du overskrider den allokerede hukommelse på din side. Du kan ændre størrelsen i php.ini eller med ini_set. Det er værdien memory_limit du skal pille i
Avatar billede tendal Nybegynder
02. februar 2007 - 10:21 #22
det jeg kan se er at memory_limit står til 16 MB, så kan det virkelig være det? Jeg har hjemmesiden hosted ved one.com så jeg er ikke sikker på at jeg kan pille ved noget - eller jeg ved i hvert fald ikke hvordan
Avatar billede kinderaeg Nybegynder
02. februar 2007 - 10:36 #23
Det kan det sagtens være, for det er jo ikke kun billedets størrelse som jpeg der tæller. Hvis du fx åbner billedet i et program som Corel, kan du se hvor meget hukommelse billedet optager, og det er tit mange gange større end filstørrelsen. Jeg ved ikke hvad begrænsningerne er på one.com, men det kan du jo høre dem om (php skal compiles med --enable-memory-limit for at du selv kan ændre den). Men du kan evt prøve at uploade mindre billeder (fx 800x600 eller noget i den stil) og se, om det ikke bliver bedre af det?!?

Du skulle kunne bruge nedenstående til at sætte en ny hukommelsesstørrelse (såfrem der er åbner for at du kan ændre i hukommelsesallokeringen):

function setMemoryForImage($filename) {
  $imageInfo = getimagesize($filename);
  $MB = 1048576;  // number of bytes in 1M
  $K64 = 65536;    // number of bytes in 64K
  $TWEAKFACTOR = 1.5;  // Or whatever works for you
  $memoryNeeded = round( ( $imageInfo[0] * $imageInfo[1]
                                          * $imageInfo['bits']
                                          * $imageInfo['channels'] / 8
                            + $K64
                          ) * $TWEAKFACTOR
                        );
  //ini_get('memory_limit') only works if compiled with "--enable-memory-limit" also
  //Default memory limit is 8MB so well stick with that.
  //To find out what yours is, view your php.ini file.
  $memoryLimitMB = 8;
  $memoryLimit = $memoryLimitMB * $MB;
  if (function_exists('memory_get_usage') &&
    memory_get_usage() + $memoryNeeded > $memoryLimit) {
    $newLimit = $memoryLimitMB + ceil( ( memory_get_usage()
                                        + $memoryNeeded
                                        - $memoryLimit
                                        ) / $MB
                                      );
    ini_set( 'memory_limit', $newLimit . 'M' );
    return true;
  } else {
    return false;
  }
}
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