Avatar billede supermand69 Nybegynder
14. oktober 2004 - 11:08 Der er 32 kommentarer og
2 løsninger

GD-lib truecolor

Jeg har en række billeder som jeg skal have lavet til thumbnails, men hvordan gør jeg det? Jeg har aldrig arbejdet med GD-lib før, så søger en lidt udførlig forklaring :)

Kan man også selv vælge kvaliteten af billedet?
Avatar billede hmortensen Nybegynder
14. oktober 2004 - 11:58 #1
Du kan gøre det sådan her:
<?php
function resize($image_name) {
    $image_dir = "images/";
    $quality = 50;
    $src_dim = getimagesize($image_dir.$image_name);
    $dest_width = 100;
    $dest_height = 100;
    $src_img = imagecreatefromjpeg("$image_dir"."$image_name");
    $dst_img = imagecreatetruecolor($dest_width,$dest_height);
    imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $dest_width,
    $dest_height, $src_dim[0], $src_dim[1]);
    imagejpeg($dst_img, $image_dir."thumbs/".$image_name, $quality);
    imagedestroy($src_img);
    imagedestroy($dst_img);
}

resize("1.jpg");
?>

Du kan selv ændre kvalitet, og str
Avatar billede supermand69 Nybegynder
14. oktober 2004 - 12:03 #2
hvordan kan man så gøre så den streamer billedet fra php?

eks. mit_billede.php?id=2

både som gif og jpeg :)
Avatar billede hmortensen Nybegynder
14. oktober 2004 - 12:15 #3
Hvad mener du med streame billedet ?
Skal den ikke gemme det på serveren, og bare vise billedet istedet ?

function resize($image_name) {
    $image_dir = "images/";
    $quality = 50;
    $dest_width = 100;
    $dest_height = 100;
    $var = explode(".", $file_name);
    $filetype = end($var);
    if ($filetype == 'jpg' OR $filetype == 'jpeg') {
        $src_dim = getimagesize($image_dir.$image_name);
        $src_img = imagecreatefromjpeg("$image_dir"."$image_name");
        $dst_img = imagecreatetruecolor($dest_width,$dest_height);
        imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $dest_width, $dest_height, $src_dim[0], $src_dim[1]);
        imagejpeg($dst_img, $image_dir."thumbs/".$image_name, $quality);
        imagedestroy($src_img);
        imagedestroy($dst_img);
    } elseif ($filetype == 'gif') {
        $src_dim = getimagesize($image_dir.$image_name);
        $src_img = imagecreatefromgif("$image_dir"."$image_name");
        $dst_img = imagecreatetruecolor($dest_width,$dest_height);
        imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $dest_width, $dest_height, $src_dim[0], $src_dim[1]);
        imagegif($dst_img, $image_dir."thumbs/".$image_name, $quality);
        imagedestroy($src_img);
        imagedestroy($dst_img);
    }
}
Avatar billede supermand69 Nybegynder
14. oktober 2004 - 12:24 #4
den skal vise billedet :) ikke lave en masse billeder om og gemme dem
Avatar billede hmortensen Nybegynder
14. oktober 2004 - 12:26 #5
Har du billede navnene stående i en database ?
Avatar billede supermand69 Nybegynder
14. oktober 2004 - 12:28 #6
ja, på en måde, men det er bare id'et der skal identificere filen

eks.
45.jpg eller 45.gif

skal bare have lavet en fil så man kan gøre således: pic.php?id=45
Avatar billede hmortensen Nybegynder
14. oktober 2004 - 12:30 #7
Altså man ved ikke om det er jpg eller gif ?

Kan der være både en 45.gif og en 45.jpg ?
Avatar billede supermand69 Nybegynder
14. oktober 2004 - 12:32 #8
jeps ;)
Avatar billede hmortensen Nybegynder
14. oktober 2004 - 12:34 #9
Hvis der både kan være en 45.gif og en 45.jpg, hvordan skal man så vide hvilken der skal vises ?
Avatar billede supermand69 Nybegynder
14. oktober 2004 - 12:36 #10
det ved man også... jeg har et felt i min db som angiver fil extension :) eks. jpg/gif

det er bare fordi jeg vil lave en global funktion som virker alle steder jeg skal lave en resize af mine pics
Avatar billede hmortensen Nybegynder
14. oktober 2004 - 12:38 #11
Det vil sige at hvis man fx kalder pic.php?id=45, så skal den slå op i databasen, hvor id er 45, og få filnavn + extension ?
Avatar billede supermand69 Nybegynder
14. oktober 2004 - 12:59 #12
jeg kan godt lave sql, det eneste jeg skal bruge er hvordan man bruger GD-lib
Avatar billede hmortensen Nybegynder
14. oktober 2004 - 13:03 #13
Det har du fået.
Den sidste tjekker om det er gif eller jpg
Avatar billede coderdk Praktikant
14. oktober 2004 - 14:13 #14
imagejpeg( $im, '', 85 );

Outputter en jpeg til browseren i quality 85, uden at gemme på serveren. Du skal bare huske at spytte content-type ud også.
Avatar billede supermand69 Nybegynder
14. oktober 2004 - 14:48 #15
jeg får denne fejl? er GD-lib ikke aktiveret eller hvad?

Fatal error: Call to undefined function: imagecreatefromjpeg()
Avatar billede supermand69 Nybegynder
14. oktober 2004 - 14:50 #16
coderdk > vil det sige at jeg bare skal nøjes med at slette $src_img? kommer mit script ikke også til at køre hurtigere sådan her? :)
Avatar billede coderdk Praktikant
14. oktober 2004 - 14:53 #17
Uhm, det lader til at du ikke har jpeg-support i din php?
Jeg forstår ikke lige dit spm? $src_img?
Mit svar var et "streaming" jpeg fra php - hindu_skp's svar er bedre da du så ikke skal resize billedet hver gang ;) I hans kan du også ændre quality osv. Jeg vist bare hvordan man kan vise et billede "on-the-fly" :)
Avatar billede supermand69 Nybegynder
14. oktober 2004 - 15:01 #18
coderdk > det er måske ikke nogen fordel at resize "on-the-fly" hver gang et billede skal vises?? grunden til jeg ville gøre det sådan er for at spare diskplads da jeg har ret mange billeder! og hvis jeg skal have en full og thumb af hvert billede bliver det til en del mb :(
Avatar billede supermand69 Nybegynder
14. oktober 2004 - 15:03 #19
jeg tror slet ikke at GD er aktiveret? hvordan gør man det?
Avatar billede supermand69 Nybegynder
14. oktober 2004 - 15:23 #20
nu har jeg vist fået det aktiveret :)

jeg er kommet frem til følgende kode, men det virker ikke... får ikke nogen fejl, men der bliver bare vist sådan et rødt kryds for at filen ikke findes??

<?
header("content-type: image/jpeg");

$file = $_GET['id'].'.jpg';
$dir_file = $_SERVER["DOCUMENT_ROOT"].str_replace(basename($_SERVER["PHP_SELF"]), '', $_SERVER["PHP_SELF"]);

$quality = 85;
$height = 96;

$src_dim = getimagesize($dir_file.$file);
$src_file = imagecreatefromjpeg($dir_file.$file);
$scale = ($src_dim[1] / $height);

$dst_width = ($src_dim[0] / $scale);
$dst_height = ($src_dim[1] / $scale);
$dst_file = imagecreatetruecolor($dst_width, $dst_height);
imagecopyresampled($dst_file, $src_file, 0, 0, 0, 0, $dst_width, $dst_height, $src_dim[0], $src_dim[1]);
imagejpeg($dst_file, $quality);
imagedestroy($src_file);
?>
Avatar billede coderdk Praktikant
14. oktober 2004 - 15:28 #21
imagejpeg($dst_file, '', $quality);
Avatar billede supermand69 Nybegynder
14. oktober 2004 - 15:29 #22
skal den her ikke med?

imagedestroy($dst_file);
Avatar billede coderdk Praktikant
14. oktober 2004 - 16:41 #23
Jo, jo - Helst :)
Avatar billede supermand69 Nybegynder
14. oktober 2004 - 16:54 #24
lav et svar begge to :)
Avatar billede coderdk Praktikant
14. oktober 2004 - 16:55 #25
Værsgo :)
Avatar billede hmortensen Nybegynder
14. oktober 2004 - 17:32 #26
Fik du det til at virke ?
Avatar billede supermand69 Nybegynder
14. oktober 2004 - 20:29 #27
tak for hjælpen!

hindu > jeps... jeg bruger det script jeg har stående ovenover :)
Avatar billede supermand69 Nybegynder
14. oktober 2004 - 20:53 #28
jeg har lige et lille tillægsspørgsmål... jeg har prøvet at bruge imagesx() og imagesy() i stedet for getimagesize(), men jeg kan ikke helt få det til at virke! den siger:
imagesx(): supplied argument is not a valid Image resource

<?
header("content-type: image/jpeg");

$file = $_GET['id'].'.jpg';
$dir_file = $_SERVER["DOCUMENT_ROOT"].str_replace(basename($_SERVER["PHP_SELF"]), '', $_SERVER["PHP_SELF"]);

$quality = 75;
$height = 96;

$src_width = imagesx($dir_file.$file);
$src_height = imagesy($dir_file.$file);
$src_file = imagecreatefromjpeg($dir_file.$file);
$scale = ($src_dim[1] / $height);

$dst_width = ($src_width / $scale);
$dst_height = ($src_height / $scale);
$dst_file = imagecreatetruecolor($dst_width, $dst_height);
imagecopyresampled($dst_file, $src_file, 0, 0, 0, 0, $dst_width, $dst_height, $src_width, $src_height);
imagejpeg($dst_file, '', $quality);
imagedestroy($src_file);
imagedestroy($dst_file);
?>
Avatar billede coderdk Praktikant
15. oktober 2004 - 00:19 #29
$src_width = imagesx($src_file);
$src_height = imagesy($src_file);
Avatar billede coderdk Praktikant
15. oktober 2004 - 00:20 #30
( skal naturligvis flyttes ned under din "$src_file =..." linie )
Avatar billede supermand69 Nybegynder
15. oktober 2004 - 11:21 #31
hvilken syntax skal jeg så bruge hvis jeg ikke skal resize billedet, men bare have den oprindelige størrelse... tænker her på imagecopyresampled()
Avatar billede hmortensen Nybegynder
15. oktober 2004 - 11:24 #32
Altså samme str billede, bare med lavere kvalitet ?
Avatar billede coderdk Praktikant
15. oktober 2004 - 11:25 #33
Hvorfor vil du så kopiere billedet?
Hvis du vil streame det i en anden kvalitet end den oprindelige, kan du i stedet for at resize bare lave en imagejpeg( $src_file, '', $nykvalitet );
Avatar billede supermand69 Nybegynder
15. oktober 2004 - 11:49 #34
Det er fordi jeg har to forskellige filer... En der laver en thumb og en der laver et full

Den som laver full skal ikke lave om på størrelsen af mit billede, men bare ligge et logo ind :) Jeg ved bare ikke om det er helt optimalt at gøre som jeg har gjort? Rart nok hvis man kan spare lidt resourcer ;)

Det skal lige siges at begge koder virker fint...

thumb.php:
------------------
<?
header("content-type: image/jpeg");

$pic = $_SERVER["DOCUMENT_ROOT"].str_replace(basename($_SERVER["PHP_SELF"]), '', $_SERVER["PHP_SELF"]).$_GET['id'].'.jpg';

$quality = 75;
$height = 96;

$src_pic = imagecreatefromjpeg($pic);
$src_width = imagesx($src_pic);
$src_height = imagesy($src_pic);

$scale = ($src_height / $height);
$dst_width = ($src_width / $scale);
$dst_height = ($src_height / $scale);

$dst_pic = imagecreatetruecolor($dst_width, $dst_height);
imagecopyresampled($dst_pic, $src_pic, 0, 0, 0, 0, $dst_width, $dst_height, $src_width, $src_height);

imagejpeg($dst_pic, '', $quality);

imagedestroy($src_pic);
imagedestroy($dst_pic);
?>

full:
-------------
<?
header("content-type: image/jpeg");

$pic = $_SERVER["DOCUMENT_ROOT"].str_replace(basename($_SERVER["PHP_SELF"]), '', $_SERVER["PHP_SELF"]).$_GET['id'].'.jpg';
$logo = $_SERVER["DOCUMENT_ROOT"].str_replace('party/'.basename($_SERVER["PHP_SELF"]), '', $_SERVER["PHP_SELF"]).'pic_logo.png';

$quality = 100;

$src_pic = imagecreatefromjpeg($pic);
$src_width = imagesx($src_pic);
$src_height = imagesy($src_pic);

$src_logo = imagecreatefrompng($logo);
$src_logo_width = imagesx($src_logo);
$src_logo_height = imagesy($src_logo);

$dst_pic = imagecreatetruecolor($src_width, $src_height);
imagecopyresampled($dst_pic, $src_pic, 0, 0, 0, 0, $src_width, $src_height, $src_width, $src_height);

$logo_x = $src_width - $src_logo_width;
$logo_y = $src_height - $src_logo_height;
imagecopyresampled($dst_pic, $src_logo, $logo_x, $logo_y, 0, 0, $src_width, $src_height, $src_width, $src_height);

imagejpeg($dst_pic, '', $quality);

imagedestroy($src_pic);
imagedestroy($src_logo);
imagedestroy($dst_pic);
?>
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