Avatar billede Slettet bruger
26. januar 2006 - 14:58 Der er 15 kommentarer og
1 løsning

Crop Image vha GDLib

Hej.
Jeg uploader et billede vha et script til en mappe på serveren og en tilhørende sti med billednavn gemmes i en MySQL-DB. Gennem scriptet dannes to billeder, et stort og et lille. Jeg vil gerne have at det lille (thumbnail) laves til et billede i 100x100 pixels som et udsnit (f.eks. midten) af billedet, altså først ned i størrelse (f.eks. 150x200) og derefter et udsnit på 100x100 heraf. Det store billede skal bibeholde sine højde/bredde-proportioner. Kan det lade sig gøre og/eller er der nogen der har et script der kan croppe? Evt. kan det måske gøres, når billedet hentes frem på hjemmesiden for at blive vist?
Håber nogen kan hjælpe...
Avatar billede jakobdo Ekspert
26. januar 2006 - 15:18 #1
Du kunne ikke blot nøjes med at resize?

function resize( $filename, $newfilename, $maxw, $maxh )
{
    $result = false;
    $srcim = imagecreatefromjpeg( $filename );
    $ow = imagesx( $srcim );
    $oh = imagesy( $srcim );
    $wscale = $maxw / $ow;
    $hscale = $maxh / $oh;
    $scale = ( $hscale < $wscale ? $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 );
    $result = imagejpeg( $dstim, $newfilename, 85 );
    imagedestroy( $dstim );
    imagedestroy( $srcim );
    return $result;
}
Avatar billede jakobdo Ekspert
26. januar 2006 - 22:02 #2
Prøv at se her: http://www.codebreaker.dk/exp/682931.php
Det er lavet med ren php! :o)
Avatar billede Slettet bruger
27. januar 2006 - 11:41 #3
Hej Jakob
Er det link, du refererer til lavet med den kode, du viser ovenfor? For det er jo lige sådan det skal være :-)
mvh Jesper
Avatar billede Slettet bruger
27. januar 2006 - 11:43 #4
...Hvis ikke, har du så tilfældigvis den crop-kode, der bruges på ko-siden?
Mvh Jesper
Avatar billede jakobdo Ekspert
27. januar 2006 - 11:51 #5
Jeg bruger denne kode:
<?php
//http://www.eksperten.dk/spm/682931

function LoadJpeg($imgname)
{
    $im = @imagecreatefromjpeg($imgname); /* Attempt to open */
    if (!$im)
    {
        /* See if it failed */
        $im  = imagecreate(500, 30); /* Create a blank image */
        $bgc = imagecolorallocate($im, 255, 255, 255);
        $tc  = imagecolorallocate($im, 0, 0, 0);
        imagefilledrectangle($im, 0, 0, 150, 30, $bgc);
        /* Output an errmsg */
        imagestring($im, 1, 5, 5, "Error loading $imgname", $tc);
    }
    return $im;
}

$src_im = LoadJpeg($_GET['url']);
$dst_im = @imagecreatetruecolor(100, 100) or die("Cannot Initialize new GD image stream");

imagecopyresampled($dst_im, $src_im, 0, 0, 100, 0, 100, 100, 200, 200 );

header("Content-type: image/jpeg");
imagejpeg($dst_im,null, 100);
//imagejpeg($src_im,null, 100);
imagedestroy($dst_im);
imagedestroy($src_im);

?>

og kalder det med:
<img src="682931-crop.php?url=http://www.sonomacheese.com/images/cow.jpg" />

Det kan laves anderledes, det var blot for at lege! :o)
Avatar billede Slettet bruger
27. januar 2006 - 14:13 #6
Nu er jeg ikke den helt store kode-ørn, så jeg skal nok lige have een lille smule mere hjælp:
Dette er min situation : Jeg har et billede i bredformat som fysisk ligger i f.eks. "billedmappe" på serveren. Dette billede henter jeg navnet på (f.eks. billede1.jpg) fra min DB og lægger det i php-koden som værdien $billede. Herefter skal det så
køres igennem dit script for at blive croppet til kvadratisk format, ikke? Og så bliver det vist på skærmen i den croppede udgave, eller..?
Kan det lade sig gøre med den kode du har lavet? ...for jeg kan se at der, hvor du henter billedet er der en $_GET['url'])...Kan jeg så bare her skrive $_GET['billedmappe/$billede']) og så funker det?
Avatar billede jakobdo Ekspert
27. januar 2006 - 14:16 #7
Du bruger blot:
$src_im = LoadJpeg("billedmappe/" .$billede);

Så skal du fjerne:
header("Content-type: image/jpeg");

og rette:
imagejpeg($dst_im,null, 100);
til:
imagejpeg($dst_im,"Navn_paa_cropped_fil.jpg", 100);
Avatar billede Slettet bruger
27. januar 2006 - 14:18 #8
Super. Det prøver jeg lige at se om jeg kan få til at fungere her i weekenden...Ellers vender jeg frygteligt tilbage ;-)
Tak for hjælpen indtil videre ihvertfald....
Avatar billede Slettet bruger
27. januar 2006 - 16:59 #9
Hej igen
Har nu prøvet med følgende kode : (Billedet uploades fra en admin-del, koden er sat ind på denne upload-side)

function LoadJpeg($file) /* det script der danner det "normale" billede hedder $file */
{
    $im = @imagecreatefromjpeg($file); /* Attempt to open */
    if (!$im)
    {
        /* See if it failed */
        $im  = imagecreate(500, 30); /* Create a blank image */
        $bgc = imagecolorallocate($im, 255, 255, 255);
        $tc  = imagecolorallocate($im, 0, 0, 0);
        imagefilledrectangle($im, 0, 0, 150, 30, $bgc);
        /* Output an errmsg */
        imagestring($im, 1, 5, 5, "Error loading $file", $tc);
    }
    return $im;
}
$src_im = LoadJpeg($_GET['url']);
$dst_im = @imagecreatetruecolor(100, 100) or die("Cannot Initialize new GD image stream");
imagecopyresampled($dst_im, $src_im, 0, 0, 100, 0, 100, 100, 200, 200 );
imagejpeg($dst_im,"../nyheder/$filnavn", 100);
//imagejpeg($src_im,null, 100);
imagedestroy($dst_im);
imagedestroy($src_im);
}

...og derefter :
mysql_query("UPDATE tabel_billeder SET crop='$filnavn' where id='$idfelt'");

...Billedet bliver godt nok 100x100 pixels når jeg henter det på en anden side, til gengæld bliver det helt hvidt?
Kan du gennemskue hvorfor?
Avatar billede jakobdo Ekspert
27. januar 2006 - 18:26 #10
Hvor stor er de billede du cropper?
Og kan jeg se hele koden du bruger?
Avatar billede Slettet bruger
28. januar 2006 - 13:01 #11
Jeg uploader et billede fra digi-cam og kører det gennem følgende kode, som genererer et stort billede (men mindre end det fra digicam, selvfølgelig) og som jeg gerne vil have til at genere en thumbnail der er kvadratisk, således at når denne thumbnail vises på den tilhørende hjemmeside, så er det ligegyldigt om billedet er lagt ind i høj- eller bredformat (af hensyn til designet). Det kræver selvfølgelig, at thumbanilen genereres i bredformat og derefter croppes (f.eks. i center af billedet så man får mest muligt med af motivet). Jeg håber du kan følge hvor jeg vil hen?! Mit problem med koden her er, at jeg ikke kan gennemskue, om billedet croppes efter det hentes fra databasen i bredformat f.eks. på selve hjemmesiden eller om det skal croppes i forbindelse med upload til databasen...

if (!empty($_POST['upload'])) {
$filnavn = date ("U");  // Jeg bruger unix timestamp som filnavn da det er den nemmeste måde at lave et unikt navn.
$filnavn = "$filnavn.jpg"; // Bare så man er fri for at sætte .jpg senere.
$fil = date ("U");  // Jeg bruger unix timestamp som filnavn da det er den nemmeste måde at lave et unikt navn.
$fil = "$fil.jpg"; // Bare så man er fri for at sætte .jpg senere.
if($file_type == "image/jpeg" || $file_type == "image/jpg" || $file_type == "image/pjpeg"){ //Checker for JPG
} else { ?>
Det valgte billede er ikke JPG-format ! <?php exit;
}
Billedet uploades til serveren!
      Vent venligst...
<?php
$size = Getimagesize($file);      //Henter pixel størelse af billed.
if($size[0] > $size[1]){  //Checker for Tværformat / Højformat.
$new_width = ("150"); //sætter min ønsket brede på billedet.
$new_width2 = ("420"); //sætter min ønsket brede på billedet.
$new_height = ($new_width/$size[0])*$size[1];  // Regner højden ud så jeg ikke får et distorted billed.
$new_height2 = ($new_width2/$size[0])*$size[1];  // Regner højden ud så jeg ikke får et distorted billed.
$src_img = imagecreatefromjpeg("$file");  //GD starter med at generer billedt.
$dst_img = imagecreatetruecolor($new_width,$new_height);
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $new_width, $new_height, $size[0], $size[1]);
touch("../nyheder/L$fil"); //bug-fix
imagejpeg($dst_img, "../nyheder/L$fil", 70); // Placere mit billed og sætter kvalitet (,70) = 0-100.
imagedestroy($src_img);
imagedestroy($dst_img);

function LoadJpeg($file)
{
    $im = @imagecreatefromjpeg($file); /* Attempt to open */
    if (!$im)
    {
        /* See if it failed */
        $im  = imagecreate(500, 30); /* Create a blank image */
        $bgc = imagecolorallocate($im, 255, 255, 255);
        $tc  = imagecolorallocate($im, 0, 0, 0);
        imagefilledrectangle($im, 0, 0, 150, 30, $bgc);
        /* Output an errmsg */
        imagestring($im, 1, 5, 5, "Error loading $file", $tc);
    }
    return $im;
}
$src_im = LoadJpeg("../nyheder/" .$file);
$dst_im = @imagecreatetruecolor(100, 100) or die("Cannot Initialize new GD image stream");
imagecopyresampled($dst_im, $src_im, 0, 0, 100, 0, 100, 100, 200, 200 );
touch("../nyheder/$filnavn"); //bug-fix
imagejpeg($dst_im,"../nyheder/$filnavn", 100);
//imagejpeg($src_im,null, 100);
imagedestroy($dst_im);
imagedestroy($src_im);
}else{ // Ellers er billedet højformat og kører samme smøre igen.
$new_height = ("150");
$new_height2 = ("420");
$new_width = ($new_height/$size[1])*$size[0];
$new_width2 = ($new_height2/$size[1])*$size[0];
$src_img = imagecreatefromjpeg("$file");
$dst_img = imagecreatetruecolor($new_width,$new_height);
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $new_width, $new_height, $size[0], $size[1]);
touch("./nyheder/$filnavn"); //bug-fix
imagejpeg($dst_img, "../nyheder/L$fil", 70);
imagedestroy($src_img);
imagedestroy($dst_img);

function LoadJpeg($file)
{
    $im = @imagecreatefromjpeg($file); /* Attempt to open */
    if (!$im)
    {
        /* See if it failed */
        $im  = imagecreate(500, 30); /* Create a blank image */
        $bgc = imagecolorallocate($im, 255, 255, 255);
        $tc  = imagecolorallocate($im, 0, 0, 0);
        imagefilledrectangle($im, 0, 0, 150, 30, $bgc);
        /* Output an errmsg */
        imagestring($im, 1, 5, 5, "Error loading $file", $tc);
    }
    return $im;
}
$src_im = LoadJpeg("../nyheder/" .$file);
$dst_im = @imagecreatetruecolor(100, 100) or die("Cannot Initialize new GD image stream");
imagecopyresampled($dst_im, $src_im, 0, 0, 100, 0, 100, 100, 200, 200 );
imagejpeg($dst_im,"../nyheder/$filnavn", 100);
//imagejpeg($src_im,null, 100);
imagedestroy($dst_im);
imagedestroy($src_im);
}
//resource dst_im, resource src_im, int dstX, int dstY, int srcX, int srcY, int dstW, int dstH, int srcW, int srcH)
mysql_query("UPDATE ksa_nyheder SET billede='L$fil', crop='$filnavn' where id='$idfelt'");
Avatar billede jakobdo Ekspert
29. januar 2006 - 19:45 #12
Damn, det var meget kode! (er ikke god til at sætte mig og læse så meget kode igennem)
Prøv at lav noget debug.
F.eks. echo "Nu er vi her...";
if(funktion())
echo "Funktion: resize() gik godt...";

osv...
Så kan du måske selv finde frem til fejlen!
Avatar billede Slettet bruger
29. januar 2006 - 20:34 #13
Jeg har fået det til at virke nu :-) Tusind tak for hjælpen..
Mvh Jesper
PS : Håber jeg kan finde ud af det med at give point nu?!
Avatar billede Slettet bruger
29. januar 2006 - 20:36 #14
Nå, det kunne jeg ikke...Åndssvagt og meget lidt brugervenligt system. Hvordan sørger jeg for at du får dine point, ved du det?
Avatar billede jakobdo Ekspert
29. januar 2006 - 20:58 #15
Så skal du oprette et spørgsmål hvor du sætter de point du synes jeg skal have!
Og så laver du en ref hertil: http://www.eksperten.dk/spm/682931
Så er det ok!
Avatar billede Slettet bruger
29. januar 2006 - 21:06 #16
Sådan...Gå til http://www.eksperten.dk/spm/683779 og send et svar så skulle den være på plads..
Takker
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

Seneste spørgsmål Seneste aktivitet
I går 21:00 Libre Office Impress Af Frank i Andre styresystemer
I går 11:47 VB script Af Jenshentze i Word
I går 11:21 Popup ved opstart Af mort1 i Windows
04/0918:50 Slet lokal konto Af ErikHg i Windows
04/0916:05 Ændre tal i en celle Af xvid i Excel