Avatar billede tamen Nybegynder
10. oktober 2002 - 15:53 Der er 31 kommentarer og
1 løsning

Skalering af billeder

Jeg har lavet et lille CMS til en lille netavis. De mente at det var ok at dem der skrev artiklerne selv skalerede bilelder (12 til hver artikel, 6 thumbnails og 6 store), men som vi alle ved er brugere dumme ;) Så nu skal jeg lave et script der skal skalere billederne, og brugerne skal så bare vælge 6 billeder de vil have på artiklen og så klarer scriptet resten.
Jeg har ikke prøvet at arbejde med billeder før, så det er her i kommer ind. Så vidt jeg har læst mig til er det forholdsvist enkelt at skalere billeder, men hvad nu hvis brugeren uploader et billede der er 20*50 og det færdige billede skal være 10*10? Bliver det så skaleret så det bliver "trykket"? Eller er PHP smart nok til at cutte noget af billedet?

Hvis der er en venlig sjæl der kan skrive en funktion der kan skalere et billede så ville jeg være evigt taknemmelig ;)
Avatar billede fangel Nybegynder
10. oktober 2002 - 17:53 #1
hej... jeg har lavet denne funktion... du skal bare lave en fil der hedder billeder.php med dette indhold, og så gøer som forklaret i filen...

---billeder.php---
<?php

/*
;
; Du skal bruge denne funktion, ved at have denne fil liggende på din server...
;
; du kan så lave et billede sådan her...
;
; <img src="billeder.php?navn=BILLEDENAVN.jpg&maxhojde=MAXHOJDE&maxbrede=MAXBREDE">
;
; (C)2002 Morten Fangel
;          mfa@desi-dev.dk
;
*/

Header( "Content-type: image/png");

function resizeimage($filnavn, $maxhojde, $maxbrede) {

  //Find højde og bredde på billede
    $size = getimagesize($filnavn);
    $width = $size[0];
    $height = $size[1];

    if($height > $maxhojde){
      $newheight = $height / ( $height / $maxhojde);
      $newwidth = $width / ( $height / $maxhojde);
    }
    if($newwidth > $maxbrede){
      $newheight = $newheight / ( $newwidth / $maxhojde);
      $newwidth = $newwidth / ( $newwidth / $maxhojde);
    }

    //lav et nyt billede
    $image = imagecreate($newwidth, $newheight);

    $white = ImageColorAllocate($image,255,0,255);
    ImageFilledRectangle($image,0,0,$newwidth,$newheight,$white);

    //åben det originale billede
    $src = imagecreatefromjpeg($filnavn);
 
    //gem billede
    imagecopyresized($image, $src, 0,0,0,0, $newwidth, $newheight, $width, $height);
    ImagePNG($image);
    ImageDestroy($image);

}

if(isset($_GET['navn']) && isset($_GET['maxhojde']) && isset($_GET['maxbrede'])){
  resizeimage($_GET['navn'], $_GET['maxhojde'],$_GET['maxbrede']);
}

?>
--/billeder.php---

Morten
Avatar billede fangel Nybegynder
10. oktober 2002 - 17:56 #2
PS, du kan ændre det til at være fx JPG billeder ved at ændre linien der lydder

Header( "Content-type: image/png");
til
Header( "Content-type: image/jpg");

og linien

ImagePNG($image);
til
ImageJPG($image);

PPS jeg er usikker på om den kun kan resize fra JPG billeder, men prøv med fx GIF...

Morten
Avatar billede tamen Nybegynder
10. oktober 2002 - 18:55 #3
Jeg skal ikke lave billeder on-the-fly som det script du har lavet gør. Når brugerne (forfatterne) laver en artikel uploader de max 6 billeder. de billeder skal så gemmes på serveren. Hvert billede i to eksemplare, et lille thumbnail, og et stort. Så skal serveren ikke hen og skalere seks billeder hver gang der kommer en og skal læse en artikel.
Desuden, hvis jeg læser din kode rigtigt, skalere den ikke bilelderne til en bestemt størrelse. Men giver en min/max bredde/højde. Min billeder skal have en bestemt højde/bredde. Eksempelvis 25*50. Hvis brugeren så uploader et bilelde der er 25*180 så bliver det presset sammen.
Men sig endelig til hvis jeg tager fejl :)
Avatar billede fangel Nybegynder
10. oktober 2002 - 19:28 #4
to punkter...

1) billedet beholder sine proportioner... det bliver ikke trykket... maxhøjde og brede fortæller hvor stort billedet MAX må være, ikke hvor stort det må være... den laver så det størst mulige billede der kan ligge i den box uden billedet mister sin form...

2) det er relativt nemt at ændre det så den gemmer billedet i steddet for at gemme billedet... her er et script som du kna bruge til at lave billeder, og gemme dem på serveren...

---billeder2.php---
<?php

/*
;
; Du skal bruge denne funktion, ved at have denne fil liggende på din server...
;
; du kan så resize, og gemme et billede ved at gå ind på en sådan adresse
;
; http://www.dit.dk/mappe/billeder2.php?filnavn=BILLEDENAVN.jpg
;
; (C)2002 Morten Fangel
;          mfa@desi-dev.dk
;
*/

Header( "Content-type: image/png");

function resizeimage($filnavn) {

  //konfiguration...
  $maxhojde = "450";
  $maxbrede = "450";

  //filnavnet på det billede der gemmes, i den nye størrelse
  $nyt_filnavn = substr($filnavn, 0, strrchr($filnavn)) . "_thumb." . substr($filnavn, strrchr($filnavn);

  //Find højde og bredde på billede
    $size = getimagesize($filnavn);
    $width = $size[0];
    $height = $size[1];

    if($height > $maxhojde){
      $newheight = $height / ( $height / $maxhojde);
      $newwidth = $width / ( $height / $maxhojde);
    }
    if($newwidth > $maxbrede){
      $newheight = $newheight / ( $newwidth / $maxhojde);
      $newwidth = $newwidth / ( $newwidth / $maxhojde);
    }

    //lav et nyt billede
    $image = imagecreate($newwidth, $newheight);

    $white = ImageColorAllocate($image,255,0,255);
    ImageFilledRectangle($image,0,0,$newwidth,$newheight,$white);

    //åben det originale billede
    $src = imagecreatefromjpeg($filnavn);

    //gem billede
    imagecopyresized($image, $src, 0,0,0,0, $newwidth, $newheight, $width, $height);
    ImagePNG($image, $nyt_filnavn);
    ImageDestroy($image);

}

if(isset($_GET['navn'])){
  resizeimage_and_save($_GET['navn']);
}

?>
--/billeder2.php---

Morten
Avatar billede fangel Nybegynder
10. oktober 2002 - 19:29 #5
hov, funktionen skal hedder resizeimage_and_save($filnavn)... det skal du lige ændre opppe i starten af lininen...
Avatar billede tamen Nybegynder
10. oktober 2002 - 20:04 #6
Ahhh... Så scriptet laver en hvid firkant i den rigtige størrelse og lægger et skaleret bilelde ned i den? Sådan kan man jo også gøre. Det ville faktisk være bedre tror jeg. Jeg kigger lidt på om jeg kan få det til at virke i morgen :)
Avatar billede fangel Nybegynder
10. oktober 2002 - 20:15 #7
faktisk bilver billledet kun så stort som det er nødvendig, du kan godt fjerne de to linier med $white... den er der kun i tilfælde af at ImagePNG ikke virker, men det vil stadig lave fejl, jeg ahr bare ikke lavet det helt færdigt endnu...

Morten
Avatar billede tamen Nybegynder
10. oktober 2002 - 20:19 #8
Btw, hvor hurtigt er scriptet? Hvis nu vi går ud fra at billederne ikke er alt for store? Hvis jeg nu siger til forfatterne at de ikke må uploade billeder i andet and jpg og ikke større en 500k, hvor lang tid tager det så for et enkelt bilelde? Bare nysgerrig.
Avatar billede fangel Nybegynder
10. oktober 2002 - 20:27 #9
kommer and på hvor hurtig serveren er... ;)

lidt at tænke over... jeg køre den på min localhost (AMD XP 2100+, 512 MB DDR333 ram), og her tager det 0.141 sek at resize et billede på 77kb... og 0.45 sek for et på 250kb...

Morten
Avatar billede tamen Nybegynder
10. oktober 2002 - 20:52 #10
Hmm... Så tror jeg nok at jeg holder mig til at gemem billederne :)
Avatar billede fangel Nybegynder
10. oktober 2002 - 21:13 #11
det gør du bare... men husk at luk spm'et...

Jeg går fra min comp. nu... men du kan altid fange mig på mfa@desi-dev.dk og give mig et meget lille sjat penge hvis du i fremtiden har brug for noget programmering... ;) hvis du ikke har nogen penge kan vi også snakke om det... ;)

Morten
- www.desi-dev.dk && www.showsource.dk
Avatar billede fangel Nybegynder
10. oktober 2002 - 21:14 #12
PS, andre og lignene koder kommer til at ligge på showsource.dk når vi lige får programmeret siden...
Avatar billede tipsen Nybegynder
10. oktober 2002 - 21:34 #13
dea_pg: Har følgende forslag til omskrivning af din funktion:

function resizeimage($filnavn, $maxhojde, $maxbredde) {
  //Find højde og bredde på billede
  $size = getimagesize($filnavn);
  $width = $size[0];
  $height = $size[1];

  if($height > $maxhojde || $width > $maxbredde) {
    $resizefactor = max($height/$maxhojde, $width/$maxbredde);
    $newheight = $height / $resizefactor;
    $newwidth = $width / $resizefactor;
  }

  //lav et nyt billede
  $image = imagecreate($newwidth, $newheight);

  $white = ImageColorAllocate($image,255,0,255);
  ImageFilledRectangle($image,0,0,$newwidth,$newheight,$white);

  //åben det originale billede
  $src = imagecreatefromjpeg($filnavn);
 
  //gem billede
  imagecopyresized($image, $src, 0,0,0,0, $newwidth, $newheight, $width, $height);
  ImagePNG($image);
  ImageDestroy($image);
}
Avatar billede fangel Nybegynder
11. oktober 2002 - 16:44 #14
tipsen => det var da en udemærket ide.. jeg er først lige begyndt at bruge GDLib... så jeg ved ikke så meget med dens funktioner... i øvrig en god de det med max()...

er du intereeret i at give/donere nogle script til showsource.dk når vi bliver færdige ?

Morten
Avatar billede fangel Nybegynder
11. oktober 2002 - 16:45 #15
PS, du vil stadig stå som den der har lavet scriptet...
Avatar billede tipsen Nybegynder
11. oktober 2002 - 18:06 #16
...hvem er det du spørger om det med at give scripts til shouwsource.dk ?
Avatar billede fangel Nybegynder
11. oktober 2002 - 19:09 #17
tipsen => dig... ;)
Avatar billede tipsen Nybegynder
11. oktober 2002 - 20:01 #18
Du donerer bare løs - jeg gav bare lidt forslag til rettelser :-)
Avatar billede fangel Nybegynder
11. oktober 2002 - 20:07 #19
men det kunne jo tænkes at du havde lavet andre sjove scipt genem din tid her på E...

Morten
Avatar billede tipsen Nybegynder
11. oktober 2002 - 20:44 #20
Puha... - ikke noget der er pænt nok til at jeg vil stå ved det :-)
Avatar billede fangel Nybegynder
12. oktober 2002 - 09:16 #21
OK... det var forsøget værd... ;)
Avatar billede tipsen Nybegynder
12. oktober 2002 - 13:28 #22
Men det kan da være der kommer noget på et tidspunkt - er i færd med at lave et kalender/aftale system, som kører i første udgave på min egen maskine - det bliver integreret med et system til at holde styr på fødselsdage og adresse/tlf/email på venner og bekendte.

Så har jeg også gang i et system som kan generere playlister til en samling mp3-filer udfra nogle nærmere definerede kriterier!
Avatar billede fangel Nybegynder
12. oktober 2002 - 13:47 #23
OK, funky...

Morten
Avatar billede tamen Nybegynder
15. oktober 2002 - 17:47 #24
Jeg sidder lige og leger med jeres script, og komemr i tanke om. I min bog står der at der er to funktioner man kan bruge til at resize et image: imagecopyresized og imagecopyresampled. Min bog siger at den sidste,  imagecopyresampled, gver pænere billeder. Er det med vilje at den ikke er brugt?
Avatar billede tamen Nybegynder
15. oktober 2002 - 17:58 #25
Det ka være lige meget, man skal have GD version 2 eller mere for at resampled virker, ser ellers ikke specielt kønt ud med resized :(
Men de må nøjes. Jeg har lave lidt ændringer i jeres script, jeg skal nok poste det når jeg har nuslet færdigt om det.
Avatar billede tamen Nybegynder
15. oktober 2002 - 18:41 #26
Her er så mit nogen lunde færdige script: Og det virker perfekt. jeg har kun medtaget til fil 2 bliver behandlet da fil 3-6 er den samme kode med tallene på variablerne skiftet ud. Desuden gemmer scriptet billerne i JPG filer og sender ikke PNG billeder til browseren, jeg var lidt usikker på om alle slut-brugerne havde mulighed for at se PNG (Faktisk aner jeg ikke hvor udbredt PNG er i browsere). men her er scriptet i hverfald:

function resizeimage($filnavn, $maxhojde, $maxbredde, $nyfil) {
  //Find højde og bredde på billede
  $size = getimagesize($filnavn);
  $width = $size[0];
  $height = $size[1];

  if($height > $maxhojde || $width > $maxbredde) {
    $resizefactor = max($height/$maxhojde, $width/$maxbredde);
    $newheight = $height / $resizefactor;
    $newwidth = $width / $resizefactor;
  }

  //lav et nyt billede
  $image = imagecreate($newwidth, $newheight);

  $white = ImageColorAllocate($image,255,0,255);
  ImageFilledRectangle($image,0,0,$newwidth,$newheight,$white);

  //åben det originale billede
  $src = imagecreatefromjpeg($filnavn);

  //gem billede
  imagecopyresized($image, $src, 0,0,0,0, $newwidth, $newheight, $width, $height);
  ImageJPEG($image, $nyfil);
  ImageDestroy($image);
}

function sletfil($sletfilnavn) {
    unlink($sletfilnavn);
}


if (is_uploaded_file($_FILES['file_1']['tmp_name'])) { /* check at filen er uploaded, hvis ikke så lav noget andet */
   
    /*     Navne på filerne */
    $uniq_org1 = uniqid("tmp_").".jpg"; /* Original filnavn */
    $uniq_thumb1 = uniqid("t_").".jpg"; /* Thumbnail billednavn, 127*97 */
    $uniq_overskriftbilled1 = uniqid("o_").".jpg"; /* Overskriftsbillednavn (kun fil 1), 318*243 */
    /*     Navne på filerne slut */
   
    /* flyt den uploadede fil */
    move_uploaded_file($_FILES['file_1']['tmp_name'], $uniq_org1);

    /* kald resize functionen for de billeder der skal resizes */
    resizeimage($uniq_org1, "97", "127", $uniq_thumb1);
    resizeimage($uniq_org1, "243", "318", $uniq_overskriftbilled1);
   
    /* slet de filer der skal slettes */
    sletfil($uniq_org1);
   
    /* skriv ud links til billederne så vi kan se resultatet af resizeningen */
    echo "Fil 1 blev til: <a href=\"".$uniq_overskriftbilled1."\">Overskriftsbilled</a> <a href=\"".$uniq_thumb1."\">thumbfile</a><br>";
   
   
}

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

    /*     Navne på filerne */
    $uniq_org2 = uniqid("tmp_").".jpg"; /* Original filnavn */
    $uniq_thumb2 = uniqid("t_").".jpg"; /* Thumbnail billednavn, 127*97 */
    /*     Navne på filerne slut */
   
    /* flyt den uploadede fil */
    move_uploaded_file($_FILES['file_2']['tmp_name'], $uniq_org2);
   
    /* kald resize functionen for de billeder der skal resizes */
    resizeimage($uniq_org2, "97", "127", $uniq_thumb2);
   
    /* skriv ud links til billederne så vi kan se resultatet af resizeningen */
    echo "Fil 2 blev til: <a href=\"".$uniq_org2."\">Org billede</a> <a href=\"".$uniq_thumb2."\">thumbfile</a><br>";

}
Avatar billede fangel Nybegynder
15. oktober 2002 - 21:59 #27
PNG er en OpenSource standard som i hvert fald er understøttet af Mozilla fra min. rc1... du kan læse om PNG på www.w3.org find PNG i menuen...

Morten
Avatar billede tamen Nybegynder
16. oktober 2002 - 09:24 #28
Hmm... Det ser jo ud som om de fleste gør det. Chekker lige min kundes log filer og ser hvad brugerne bruger af browsere.

Vil du stadig ikke ha points Morten? Så giver jeg dem til tipsen hvis han laver et svar.
Avatar billede fangel Nybegynder
16. oktober 2002 - 10:04 #29
jeg vil ikke have point... jeg syntes du skal tage dem selv... ikke give dem til tipsen (ikke for at være ond) men han har jo sådan set kun forbedret mit script...

Morten
Avatar billede tamen Nybegynder
16. oktober 2002 - 10:13 #30
Ok, så gør jeg det. Hvis du ser dether, tipsen, og syntes det er møguretfærdigt, så skriv til mig, så finder vi ud af noget :)

Tak for hjælpen Morten, og tipsen.
Hvis du vil bruge mit script eller dele af det er du velkommen Morten :)
Avatar billede fangel Nybegynder
16. oktober 2002 - 10:15 #31
kig forbi www.showsource.dk en gang om et måneds tid eller deromkring, så kan du forhåbenligt poste dit scipt der... ;)
Avatar billede tamen Nybegynder
16. oktober 2002 - 11:24 #32
Ok, det vil jeg gøre :)
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