Avatar billede Peter Praktikant
25. februar 2004 - 18:26 Der er 28 kommentarer og
1 løsning

Generere thumbnail, fejl i mit script.

Hej
Jeg vil gerne lave et galleri, men da det jo er en stor omgang om mit kendskab til PHP er lille er jeg startet i det lidt mindre. Jeg forsøger på at lave en thumbnail med følgende script:
<?php
# Constants
define(IMAGE_BASE, '/customers/nskjaer.dk/nskjaer.dk/httpd.www/php');
define(MAX_WIDTH, 150);
define(MAX_HEIGHT, 150);

# Get image location
$image_file = str_replace('..', '', $_ENV['QUERY_STRING']);
$image_path = IMAGE_BASE . "/$image_file";

# Load image
$img = null;
$ext = strtolower(end(explode('.', $image_path)));
if ($ext == 'jpg' || $ext == 'jpeg') {
    $img = @imagecreatefromjpeg($image_path);
} else if ($ext == 'png') {
    $img = @imagecreatefrompng($image_path);
# Only if your version of GD includes GIF support
} else if ($ext == 'gif') {
    $img = @imagecreatefrompng($image_path);
}

# If an image was successfully loaded, test the image for size
if ($img) {

    # Get image size and scale ratio
    $width = imagesx($img);
    $height = imagesy($img);
    $scale = min(MAX_WIDTH/$width, MAX_HEIGHT/$height);

    # If the image is larger than the max shrink it
    if ($scale < 1) {
        $new_width = floor($scale*$width);
        $new_height = floor($scale*$height);

        # Create a new temporary image
        $tmp_img = imagecreatetruecolor($new_width, $new_height);

        # Copy and resize old image into new image
        imagecopyresized($tmp_img, $img, 0, 0, 0, 0,
                        $new_width, $new_height, $width, $height);
        imagedestroy($img);
        $img = $tmp_img;       
    }   
}

# Create error image if necessary
if (!$img) {
    $img = imagecreate(MAX_WIDTH, MAX_HEIGHT);
    imagecolorallocate($img,0,0,0);
    $c = imagecolorallocate($img,70,70,70);
    imageline($img,0,0,MAX_WIDTH,MAX_HEIGHT,$c2);
    imageline($img,MAX_WIDTH,0,0,MAX_HEIGHT,$c2);
}

# Display the image
header("Content-type: image/jpeg");
imagejpeg($img);
?>

og så indsætte billeder med:

<img src="/image.php?jakob1.jpg">

Billedet og php-filen image.php ligger i samme folder, nemlig /php.

Links:
www.nskjaer.dk/php/image.php
www.nskjaer.dk/php/image.html
Info om serveropsætning kan ses her:
www.nskjaer.dk/php/action.php

Jeg synes at have set et sted at _SERVER ikke duer hvis man kører på en Zend server hvilket jeg tror jeg gør.
Jeg har også forsøgt med forskellige stier, men intet har virket, hvis jeg udskriver den komplette sti så giver den
/customers/nskjaer.dk/nskjaer.dk/httpd.www/php/
og ikke
/customers/nskjaer.dk/nskjaer.dk/httpd.www/php/jakob1.jpg

Er der nogle der kan gennemskue hvad problemet er?
Avatar billede Peter Praktikant
25. februar 2004 - 18:27 #1
Hov, denne linje:
$image_file = str_replace('..', '', $_ENV['QUERY_STRING']);

Er faktisk
$image_file = str_replace('..', '', $_SERVER['QUERY_STRING']);
Avatar billede detox Nybegynder
25. februar 2004 - 20:26 #2
Jo det kan du fint bruge, men der er et par småfejl i scriptet. Prøv:

<?php
# Constants
define('IMAGE_BASE', '/customers/nskjaer.dk/nskjaer.dk/httpd.www/php/');
define('MAX_WIDTH', 150);
define('MAX_HEIGHT', 150);

# Get image location
$image_file = str_replace('..', '', $_SERVER['QUERY_STRING']);
$image_path = IMAGE_BASE . "$image_file";

# Load image
$img = null;
$ext = strtolower(end(explode('.', $image_path)));
if ($ext == 'jpg' || $ext == 'jpeg') {
    $img = @imagecreatefromjpeg($image_path);
} else if ($ext == 'png') {
    $img = @imagecreatefrompng($image_path);
# Only if your version of GD includes GIF support
} else if ($ext == 'gif') {
    $img = @imagecreatefrompng($image_path);
}

# If an image was successfully loaded, test the image for size
if ($img) {

    # Get image size and scale ratio
    $width = imagesx($img);
    $height = imagesy($img);
    $scale = min(MAX_WIDTH/$width, MAX_HEIGHT/$height);

    # If the image is larger than the max shrink it
    if ($scale < 1) {
        $new_width = floor($scale*$width);
        $new_height = floor($scale*$height);

        # Create a new temporary image
        $tmp_img = imagecreatetruecolor($new_width, $new_height);

        # Copy and resize old image into new image
        imagecopyresampled($tmp_img, $img, 0, 0, 0, 0,
                        $new_width, $new_height, $width, $height);
        imagedestroy($img);
        $img = $tmp_img;     
    } 
}

# Create error image if necessary
if ($img) {
    imagedestroy($img);
    $img = imagecreate(MAX_WIDTH, MAX_HEIGHT);
    imagecolorallocate($img,0,0,0);
    $c = imagecolorallocate($img,255,0,0);
    imageline($img,0,0,MAX_WIDTH,MAX_HEIGHT,$c);
    imageline($img,MAX_WIDTH,0,0,MAX_HEIGHT,$c);
}

# Display the image
header("Content-type: image/jpeg");
imagejpeg($img);
?>

og så kald billedet med:
<img src="/php/image.php?jakob1.jpg" alt="En alternativ tekst" />
Avatar billede detox Nybegynder
25. februar 2004 - 20:31 #3
Hov der er en lille fejl i: # Create error image if necessary afsnittet:

# Create error image if necessary
if (!$img) {
    $img = imagecreate(MAX_WIDTH, MAX_HEIGHT);
    imagecolorallocate($img,0,0,0);
    $c = imagecolorallocate($img,255,0,0);
    imageline($img,0,0,MAX_WIDTH,MAX_HEIGHT,$c);
    imageline($img,MAX_WIDTH,0,0,MAX_HEIGHT,$c);
}
Avatar billede Peter Praktikant
25. februar 2004 - 20:32 #4
nu har jeg siddet og kigget lidt på det du har skrevet, det er vel ikke sådan at du kan fortælle hvilke fejl der var, eller hvilke steder du har lavet ændringer? Jeg har taget scriptet direkte fra en side med tutorials, så jeg kan ikke forstå der skulle være fejl i det udover at jeg måske har angivet den forkerte sti i image_base.
Avatar billede Peter Praktikant
25. februar 2004 - 20:33 #5
den laver ellers fint et error image, så det kan ikke have været så alvorlig en fejl. Men du må stadigvæk gerne skrive hvilke ændringer du har foretaget.
Avatar billede detox Nybegynder
25. februar 2004 - 20:35 #6
Der manglede bl.a: apostroffer i disse: define('MAX_HEIGHT', 150);
I disse liner var der brugt $c2 og $c (skal kun være $c):
    $c = imagecolorallocate($img,255,0,0);
    imageline($img,0,0,MAX_WIDTH,MAX_HEIGHT,$c);
    imageline($img,MAX_WIDTH,0,0,MAX_HEIGHT,$c);
Avatar billede detox Nybegynder
25. februar 2004 - 20:36 #7
Og selvfølgelig stien her:
<img src="/php/image.php?jakob1.jpg" alt="En alternativ tekst" />
Prøv evt:
<img src="image.php?jakob1.jpg" alt="En alternativ tekst" />
da jeg kan forstå de ligger i samme mappe.
Avatar billede detox Nybegynder
25. februar 2004 - 20:39 #8
Samt $_ENV kontra $_SERVER, som du selv gjorde opmærksom på.
Avatar billede detox Nybegynder
25. februar 2004 - 20:41 #9
Desuden har jeg byttet: imagecopyresized ud med: imagecopyresampled, da den giver et meget bedre resultat.
Og så har jeg rettet farven her, da den anden ikke kunne ses på sort baggrund:
$c = imagecolorallocate($img,255,0,0);
Avatar billede Peter Praktikant
25. februar 2004 - 21:16 #10
Okay, nu har jeg kopieret det du har skrevet og uploadet det hele her:
http://www.nskjaer.dk/image.php
http://www.nskjaer.dk/image.html
Jeg har rettet stien til:
define('IMAGE_BASE', '/customers/nskjaer.dk/nskjaer.dk/httpd.www/');
Det har stadigvæk ikke ændret noget.
Kan det have noget at gøre med den sti? For det er ligesom den ikke finder billedet.
Du kan se min serveropsætning her:
www.nskjaer.dk/php/action.php
Der er stadigvæk noget galt, men jeg kan ikke finde ud af hvad.
Avatar billede Peter Praktikant
25. februar 2004 - 21:20 #11
Ved at ændre linjen med stien til:
define('IMAGE_BASE', '/');
viser den i det mindste fejlbilledet, det sorte med kryds igennem. Men den viser stadigvæk ikke den thumbnail som den jo gerne skulle. jakob1.jpg ligger i roden i øjeblikket, det samme gør image.php og image.html.
Avatar billede detox Nybegynder
25. februar 2004 - 21:27 #12
Hvis jeg var dig, vil jeg helt glemme det med paths. Når alle tre filer ligger i samme mappe, kan du nøjes med:

<?php
# Constants
define('MAX_WIDTH', 150);
define('MAX_HEIGHT', 150);

# Get image location
$image_path = $_SERVER['QUERY_STRING'];

# Load image
$img = null;
$ext = strtolower(end(explode('.', $image_path)));
if ($ext == 'jpg' || $ext == 'jpeg') {
    $img = @imagecreatefromjpeg($image_path);
} else if ($ext == 'png') {
    $img = @imagecreatefrompng($image_path);
# Only if your version of GD includes GIF support
} else if ($ext == 'gif') {
    $img = @imagecreatefrompng($image_path);
}

# If an image was successfully loaded, test the image for size
if ($img) {

    # Get image size and scale ratio
    $width = imagesx($img);
    $height = imagesy($img);
    $scale = min(MAX_WIDTH/$width, MAX_HEIGHT/$height);

    # If the image is larger than the max shrink it
    if ($scale < 1) {
        $new_width = floor($scale*$width);
        $new_height = floor($scale*$height);

        # Create a new temporary image
        $tmp_img = imagecreatetruecolor($new_width, $new_height);

        # Copy and resize old image into new image
        imagecopyresampled($tmp_img, $img, 0, 0, 0, 0,
                        $new_width, $new_height, $width, $height);
        imagedestroy($img);
        $img = $tmp_img;   
    }
}

# Create error image if necessary
if (!$img) {
    $img = imagecreate(MAX_WIDTH, MAX_HEIGHT);
    imagecolorallocate($img,0,0,0);
    $c = imagecolorallocate($img,255,0,0);
    imageline($img,0,0,MAX_WIDTH,MAX_HEIGHT,$c);
    imageline($img,MAX_WIDTH,0,0,MAX_HEIGHT,$c);
}

# Display the image
header("Content-type: image/jpeg");
imagejpeg($img);
?>

Og så kalde det med:

<img src="image.php?jakob1.jpg" alt="En alternativ tekst" />
Avatar billede Peter Praktikant
25. februar 2004 - 21:32 #13
Nu er det kun image.php der vil vise fejlbilledet, image.html viser et "brækket" billede. Jeg går ud fra at der stadigvæk er problemer med
$image_path = $_SERVER['QUERY_STRING'];
Den finder i hvert tilfælde ikke noget billede og genererer jo derfor fejlbilledet.
Avatar billede Peter Praktikant
25. februar 2004 - 21:38 #14
Der må da være en eller anden måde jeg kan fejlfinde på skidtet eller hvad?
Avatar billede detox Nybegynder
25. februar 2004 - 21:39 #15
Det ser ud til din version af GD er for gammel til at bruge funktionerne:
imagecreatetruecolor() og imagecopyresampled().
Avatar billede detox Nybegynder
25. februar 2004 - 21:40 #16
Prøv med:

<?php
# Constants
define('MAX_WIDTH', 150);
define('MAX_HEIGHT', 150);

# Get image location
$image_path = $_SERVER['QUERY_STRING'];

# Load image
$img = null;
$ext = strtolower(end(explode('.', $image_path)));
if ($ext == 'jpg' || $ext == 'jpeg') {
    $img = @imagecreatefromjpeg($image_path);
} else if ($ext == 'png') {
    $img = @imagecreatefrompng($image_path);
# Only if your version of GD includes GIF support
} else if ($ext == 'gif') {
    $img = @imagecreatefrompng($image_path);
}

# If an image was successfully loaded, test the image for size
if ($img) {

    # Get image size and scale ratio
    $width = imagesx($img);
    $height = imagesy($img);
    $scale = min(MAX_WIDTH/$width, MAX_HEIGHT/$height);

    # If the image is larger than the max shrink it
    if ($scale < 1) {
        $new_width = floor($scale*$width);
        $new_height = floor($scale*$height);

        # Create a new temporary image
        $tmp_img = imagecreate($new_width, $new_height);

        # Copy and resize old image into new image
        imagecopyresized($tmp_img, $img, 0, 0, 0, 0,
                        $new_width, $new_height, $width, $height);
        imagedestroy($img);
        $img = $tmp_img; 
    }
}

# Create error image if necessary
if (!$img) {
    $img = imagecreate(MAX_WIDTH, MAX_HEIGHT);
    imagecolorallocate($img,0,0,0);
    $c = imagecolorallocate($img,255,0,0);
    imageline($img,0,0,MAX_WIDTH,MAX_HEIGHT,$c);
    imageline($img,MAX_WIDTH,0,0,MAX_HEIGHT,$c);
}

# Display the image
header("Content-type: image/jpeg");
imagejpeg($img);
?>
Avatar billede detox Nybegynder
25. februar 2004 - 21:42 #17
Det fremgår af dette link:
http://www.nskjaer.dk/image.php?jakob1.jpg
Avatar billede detox Nybegynder
25. februar 2004 - 21:42 #18
Er det din egen server?
Avatar billede Peter Praktikant
25. februar 2004 - 21:43 #19
udover du har ændret imagecreate kan jeg ikke se ændringer.
Jeg har i hvert tilfælde fået det til at komme lidt videre ved at ændre til:
$image_path = "jakob1.jpg";
Nu finder den da billedet og indlæser det, nu brokker den sig så bare over det ikke er GD 2.0:
Warning: imagecreatetruecolor(): requires GD 2.0 or later in /customers/nskjaer.dk/nskjaer.dk/httpd.www/image.php on line 35

Warning: imagecopyresampled(): requires GD 2.0 or later in /customers/nskjaer.dk/nskjaer.dk/httpd.www/image.php on line 39

Prøver lige at ændre de to til imagecreate og imagecopyresized for at se hvad det giver.
Avatar billede Peter Praktikant
25. februar 2004 - 21:46 #20
Nej, det er ikke min egen server, så jeg ved ikke voldsomt meget om hvilke versioner af hvad der ligger på den.
Men nu virker det, bortset fra at filnavnet er hårdkodet ind i php-filen, hvordan får jeg det til at virke med $image_path = $_SERVER['QUERY_STRING'];
eller lign.?
Avatar billede Peter Praktikant
25. februar 2004 - 21:49 #21
Nu virker det sørme, ved ikke hvorfor $image_path = $_SERVER['QUERY_STRING'];
lige pludseligt virker når det ikke gjorde før.
Avatar billede detox Nybegynder
25. februar 2004 - 21:49 #22
Ja, det burde da virke. Prøv:

$image_path = $_SERVER['QUERY_STRING'];
echo $image_path;
exit;

og se om ikke det giver: "jakob1.jpg"
Avatar billede detox Nybegynder
25. februar 2004 - 21:52 #23
Ok, så. I øvrigt kører serveren med ver. 4.2.2 og du skal vidst op på 4.3 før GD-lib virker med de nyere funktioner.
Avatar billede detox Nybegynder
25. februar 2004 - 22:00 #24
Det er tit stien det er galt med når noget driller. Et godt råd kan være at bruge relative stier istedet for absolutte, men det afhænger nogen gange af serveropsætningen.
Et andet godt tip til fejlfinding er at fjerne @ fra koden fx her:
$img = @imagecreatefromjpeg($image_path);
@ undertrykker nemlig evt. fejlmeddelelser, som kan være meget brugbare ved debug af scripts.
Ellers vil jeg anbefale at udskrive variabler undervejs i scriptet, for at se om de indeholder, hvad man forventer.
Avatar billede Peter Praktikant
25. februar 2004 - 22:01 #25
den skriver selvfølgeligt det rigtige nu, men før skrev den ikke noget, jeg har kun ændret linjen til at have hårdkodet filnavnet og så tilbage, ved ikke hvilken ændring det har medført, men nu virker det jo.
Det er da lidt irreterende at de ikke kører med en ny nok version, tror lige jeg vil skrive til dem og høre hvornår de opdaterer til nyeste version så jeg kan få flottere billeder (nu skal jeg selvfølgeligt lige have programmeret skidtet først).
Nu skal jeg så bare have lavet et loop så jeg kan køre igennem alle billeder i en mappe, skal lige finde ud af hvordan jeg gør det smart.
Planen er jo som sagt at lave et helt galleri, men mine færdigheder med PHP er jo lige i øjeblikket ikke så gode. Men jeg satser da på at ved at tage en bid af gangen vil det lykkes. Jeg vender sikkert tilbage med nye spørgsmål.
Tak for hjælpen for nu, hvis du ligger et svar får du point.
Hvis du lige hurtigt kan fortælle en måde hvorpå jeg kan definere størrelsen af billedet fra linket vil det være værdsat, hvis det ikke er så ligetil, så bare lad være, så finder jeg ud af det senere.
Avatar billede Peter Praktikant
25. februar 2004 - 22:04 #26
du var hurtigere end mig :) Jeg forsøgte rent faktisk at udskrive variable undervejs, men eftersom query intet resultat fik til at starte med var den jo tom. Jeg kunne bare ikke gennemskue hvorfor den var tom og har stadigvæk ikke gjort det. Jo, jeg har fjernet string-replace, det er nok den der har givet fejl. Problemet er jo så bare at man nu vil kunne kalde image.php med billeder fra mapper længere oppe i hierakiet.
Avatar billede detox Nybegynder
25. februar 2004 - 22:18 #27
Det er måden at gøre det på et skridt ad gangen. Og det er osse det sjoveste at lære det selv, fremfor at bruge nogle færdige scripts man ikke forstår alligevel.
Jeg kan nu ikke se noget galt med den str_replace() og den virker da osse her hos mig.
Kan det måske tænkes at din browser har noget cache, så den ikke har refreshet siderne rigtigt?
En anden (og måske bedre) måde at overføre variabler via URL'en, er at bruge $_GET variablen. Altså i dette tilfælde:
<img src="image.php?pic=jakob1.jpg" alt="En alternativ tekst" />

$image_path = $_GET['pic'];
Avatar billede Peter Praktikant
25. februar 2004 - 22:24 #28
GET kan jeg bedre lide og nu virker string-replace også. Der er noget cache, men jeg trykker F5 hver gang, det skulle jo gå uden om cachen hvilket den helt sikkert også gør, for alle andre ændringer træder i kraft.
Men ja, jeg kan også bedst lide at have lavet det selv, og så lærer jeg php samtidigt, det er jo ikke så dårligt.
Men indtil videre er det jo kun en meget lille del jeg har fået til at virke, der er lang vej endnu. Jeg har heldigvis ikke travlt.
Tak for hjælpen endnu en gang.
Avatar billede detox Nybegynder
25. februar 2004 - 22:37 #29
Velbekommen
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