WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Göra thumbnails i PHP (https://www.wn.se/forum/showthread.php?t=2927)

Filip 2004-07-28 10:18

Någon som har en färdig funktion för att göra JPEG-thumbnails i PHP?
Dvs att man har en jpeg fil någonstans på servern och förminskar den till valfri storlek och skapar en ny fil.
Jag har provat massor av olika färdigskrivna scripts, men ingen som funkar bra. Antingen så blir det fel med färgerna, eller så finns det en max gräns på bilder på >800kb.

Den senaste kladden av funktioner, ser ut såhär:



$abc = imagecreatefromjpeg($_FILES["myfile"]["tmp_name"]);
$def = imagecreate($newWidth, $newHeight);
imagecopyresized($def, $abc, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
imagejpeg($def, '/home/*******/httpdocs/new_thumb.jpg', 95);
ImageDestroy($abc);
ImageDestroy($def);

/*
$im = ImageCreateFromJPEG($newWidth, $newHeight) or die("Cannot Initialize new GD image stream");
imagecopyresized ( $im, $_FILES["myfile"]["tmp_name"], 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);

copy($im, PATH.$dirname."/".$filename) or die("Error: could not copy file.");

*/

nallebjorn 2004-07-28 10:29

Kan iaf hjälpa dig med att få rätt på färgerna...
använd imagecreatetruecolor istället för imagecreate
Angående storleksbegrensning har jag inte noterat någon sådan....
möjligen använda imagecopyresampled i stället för imagecopyresized

sen om man alltid vill ha rätt utsende på sin omsamplade bild så kan man behöva
jämnföra proportioner på bilderna (orginal mot thumbnailen man vill ha)

grazzy 2004-07-28 10:39

Kod:

    $ext = strtolower(substr($_FILES["filen"]["name"],-3,3));
    $filename = "/home/grazzy/public_html/images/galleries" . chop($gallery[url]) . substr($_FILES["filen"]["name"],0,-3)
 . strtolower(substr($_FILES["filen"]["name"],-3,3));
    move_uploaded_file($_FILES["filen"]["tmp_name"], $filename);
    $namethumb = $namn . "_thumb." . $ext;
    $namemedium = $namn . "_800." . $ext;
    $nameorginal = $namn . "_org." . $ext;
    `convert -scale 100x100 $filename $namethumb`;
    `convert -scale 800x600 $filename $namemedium`;
    `convert $filename $nameorginal`;
    `rm -f $filename`;

Det där e lite trix jag kör med, delvis för att jag inte orkade plöja igenom phps alla funktioner, finns säkert nån. Jag använder iaf imagicks "convert" som finns på dom flesta linuxar nuförtiden..

zoran 2004-07-28 11:19

Citat:

Originally posted by grazzy@Jul 28 2004, 10:39
Kod:

* * * *$ext = strtolower(substr($_FILES["filen"]["name"],-3,3));
 * * * *$filename = "/home/grazzy/public_html/images/galleries" . chop($gallery[url]) . substr($_FILES["filen"]["name"],0,-3)
 . strtolower(substr($_FILES["filen"]["name"],-3,3));
 * * * *move_uploaded_file($_FILES["filen"]["tmp_name"], $filename);
 * * * *$namethumb = $namn . "_thumb." . $ext;
 * * * *$namemedium = $namn . "_800." . $ext;
 * * * *$nameorginal = $namn . "_org." . $ext;
 * * * *`convert -scale 100x100 $filename $namethumb`;
 * * * *`convert -scale 800x600 $filename $namemedium`;
 * * * *`convert $filename $nameorginal`;
 * * * *`rm -f $filename`;

Det där e lite trix jag kör med, delvis för att jag inte orkade plöja igenom phps alla funktioner, finns säkert nån. Jag använder iaf imagicks "convert" som finns på dom flesta linuxar nuförtiden..

Nackdelen med denna metod är att den förmodligen inte fungerar i "Safe mode".

/Zoran

Filip 2004-07-28 11:20

Citat:

Originally posted by nallebjorn@Jul 28 2004, 11:29
Kan iaf hjälpa dig med att få rätt på färgerna...
använd imagecreatetruecolor istället för imagecreate
Angående storleksbegrensning har jag inte noterat någon sådan....
möjligen använda imagecopyresampled i stället för imagecopyresized

sen om man alltid vill ha rätt utsende på sin omsamplade bild så kan man behöva
jämnföra proportioner på bilderna (orginal mot thumbnailen man vill ha)

@nallebjorn - Det fungerade mycket bättre med imagecreatetruecolor()!
Tack så mycket nallebjorn!


@grazzy - Jag fick inte din funktion att fungera. Men jag gav inte hela min själv i det för att jag fick det att fungera med det första tipset. Dock var det ganska smart du gör med att lägga tre versioner av samma bild. Borde nog implentera något liknande själv.

Jonas 2004-07-28 20:31

Citat:

Originally posted by zoran@Jul 28 2004, 11:19
Nackdelen med denna metod är att den förmodligen inte fungerar i "Safe mode".
Jo, klart den gör...

Har administratören confat PHP rätt och gjort inställningarna rätt så skall imagemagick fungera utmärkt i Safe_mode.

grazzy 2004-07-28 22:00

Citat:

Ursprungligen postat av Filip
Citat:

Ursprungligen postat av nallebjorn
Kan iaf hjälpa dig med att få rätt på färgerna...
använd imagecreatetruecolor istället för imagecreate
Angående storleksbegrensning har jag inte noterat någon sådan....
möjligen använda imagecopyresampled i stället för imagecopyresized

sen om man alltid vill ha rätt utsende på sin omsamplade bild så kan man behöva
jämnföra proportioner på bilderna (orginal mot thumbnailen man vill ha)

@nallebjorn - Det fungerade mycket bättre med imagecreatetruecolor()!
Tack så mycket nallebjorn!


@grazzy - Jag fick inte din funktion att fungera. Men jag gav inte hela min själv i det för att jag fick det att fungera med det första tipset. Dock var det ganska smart du gör med att lägga tre versioner av samma bild. Borde nog implentera något liknande själv.

filip: yes, det e good shit att komprimera om även orginalbilden då den oftast blir ~30-40% mindre utan synbara artifakter.

Såvida man inte är proffsfotograf då kanske, men det är knappast så i mitt fall :)

festiz 2004-08-09 14:00

Jag använder denna fina funktion för att räkna ut proportioner och liknande vid skapande av tumnaglar.
Därmed får man en bild som är ett fast antal pixlar stor där bilden inuti kan ha sina korrekta proportioner men att bilden, layoutmässigt alltid tar upp lika stor plats. Börjar dock lacka på att GD är så dålig på att göra tumnaglar och funderar på att gå över till NetPBM eller ImageMagick
Kod:

function imageresize( $bild, $maxbredd, $maxhojd, $mapp, $bakgrund) {
if(!isset ($bild) || !isset($maxhojd) || !isset($maxbredd) || !isset($mapp) || !isset($bakgrund) ){
exit("Du har utel&auml;mnat n&aring;got vitalt argument i funktionen!<br />
Du b&ouml;r kalla funktionen med <pre>'imageresize( bildnamn, maxbredd, maxh&ouml;jd, m&aring;lmapp, hexadecimal bakgrundsf&auml;rg)'</pre>");
}
if($bakgrund == 0)
$bakgrund="FFFFFF";
$bild_path = "/home/festiz/web/new/images/products/large/" . $bild;
$target_path = "/home/festiz/web/new/images/products/" . $mapp . "/" . $bild;
list($width, $height, $type, $attr) = getimagesize( $bild_path );
error_reporting (E_ALL);
$abc = imagecreatefromjpeg( $bild_path );
$def = imagecreatetruecolor( $maxbredd, $maxhojd );
$ratio = $height/$width;
if ( $ratio<1 )
{
        $new_bredd=$maxbredd;
        $new_hojd=$new_bredd*$ratio;
} else {
        $new_hojd=$maxhojd;
        $new_bredd=$new_hojd*$ratio;
}
sscanf($bakgrund, "%2x%2x%2x", $red, $green, $blue);
$stringcolor=ImageColorAllocate($def,$red,$green,$blue);
imagefilledrectangle($def, 0, 0, $maxbredd, $maxhojd,$stringcolor);
imagecopyresized($def, $abc, 0, 0, 0, 0, $new_bredd, $new_hojd, $width, $height);
imagejpeg($def, $target_path, 100);
ImageDestroy($abc);
ImageDestroy($def);
}

Du får använda denna funktion hur du vill och skriva om den hur du vill, även kommersiella projekt går bra då jag betraktar denna kodsnutt som släppt under GPL.

affe_810221 2004-08-27 15:42

Använder följande när jag laddar upp och skapar thumbnails på mina sajter.

//$filadress=lokal filadress
//$fotoid=filens namn

if(copy("$filadress","fotoarkiv/$fotoid.jpg")){ //om uppladdningen lyckas

// ändra storleken
$size = getimagesize ("fotoarkiv/$fotoid.jpg");
$ursprwidth=$size[0];
$ursprheight=$size[1];

//bredd>höjd
if($size[0]>$size[1] && $size[0]>410){
$size[1]=$size[1]*410/$size[0];
//size[0]=width
$size[0]=410;
}
elseif($size[1]>390){
$size[0]=$size[0]*390/$size[1];
$size[1]=390;
}

$src_img = imagecreatefromjpeg("fotoarkiv/$fotoid.jpg");
$dst_img = imagecreatetruecolor($size[0],$size[1]);
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $size[0], $size[1], $ursprwidth, $ursprheight);
imagejpeg($dst_img, "fotoarkiv/$fotoid.jpg", 75);

//slut ändra storlek

//skapa thumbnail

$size = getimagesize ("fotoarkiv/$fotoid.jpg");
$ursprwidth=$size[0];
$ursprheight=$size[1];
//bredd>höjd
if($size[0]>$size[1] && $size[0]>100){
$size[1]=$size[1]*100/$size[0];
//size[0]=width
$size[0]=100;
}
elseif($size[1]>100){
$size[0]=$size[0]*100/$size[1];
$size[1]=100;
}
//annars blir d ingen förändring av storleken

$src_img = imagecreatefromjpeg("fotoarkiv/$fotoid.jpg");
$dst_img = imagecreatetruecolor($size[0],$size[1]);
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $size[0], $size[1], $ursprwidth, $ursprheight);
imagejpeg($dst_img, "fotoarkiv/thumbnails/$fotoid.jpg", 75);

//slut skapa thumbnail

flush();
header("Location: fotoarkiv.php");

} //slut om uppladdningen lyckades
else{
mysql_query("delete from fotoarkiv where id='$nyttfotoid'");
echo "uppladdningen misslyckades";
}


Alla tider är GMT +2. Klockan är nu 16:48.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson