Avatar billede hurra Novice
17. april 2006 - 12:16 Der er 16 kommentarer og
1 løsning

imagejpeg: Hvad er fejlen

Hej folkens

Jeg er ved at lave et lille web galleri. Jeg vil gerne ha de "rigtige" billeder gemt lidt væk fra brugeren, så jeg har lavet et lille php script til at vise billedet, Altså i min kode kommer det til at ligne noget ala: "<img src='picture.php?filename=billednavn.jpg>". Men det virker bare ikke.

Jeg får fejlen:
The image “http://localhost/gallery/picture.php?path=2%2F&filename=dsc_7763.jpg&size=1” cannot be displayed, because it contains errors.

Til sidst i picture.php har jeg disse linier:
//echo $path;
$im = imagecreatefromjpeg($path);
header("Content-type: image/jpeg");
imagejpeg($im, "", 100);
imagedestroy($im);
Jeg har checkec at $path er rigtigt, om indeholder også fil navnet.

Her i et bud på hvad jeg gør galt?
Avatar billede hmortensen Nybegynder
17. april 2006 - 12:33 #1
Sætter du filename på path længere oppe i scriptet, for så vidt jeg kan se, bruger du kan path i dit imagecreatefromjpeg() kald.
Avatar billede jakobdo Ekspert
17. april 2006 - 13:06 #2
Jeg har leget lidt med en funktion:

<?php
//http://www.eksperten.dk/spm/703194

function resize( $srcim, $ratio )
{
    $ow = imagesx( $srcim );
    $oh = imagesy( $srcim );
    $nw = round( $ow * $ratio, 0 );
    $nh = round( $oh * $ratio, 0 );
    $dstim = imagecreatetruecolor( $nw, $nh );
    imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh );
    return $dstim;
}

function LoadJpeg($imgname)
{
    $im = @imagecreatefromjpeg($imgname); /* Attempt to open */
    if(!$im)
    {
        /* See if it failed */
        $im  = imagecreatetruecolor(100, 20); /* Create a black image */
        $bgc = imagecolorallocate($im, 239, 239, 239);
        $tc  = imagecolorallocate($im,  0,  0,  0);
        imagefilledrectangle($im, 0, 0, 100, 20, $bgc);
        /* Output an errmsg */
        imagestring($im, 1, 5, 5, "Error loading jpeg", $tc);
    }
    return $im;
}

header("Content-type: image/jpeg");
$myImage = LoadJpeg($_GET['filename']);
switch($_GET['size'])
{
    case 1:
        $myImage = resize($myImage,0.25);
        break;
    case 2:
        $myImage = resize($myImage,0.50);
        break;
    case 3:
        $myImage = resize($myImage,0.75);
        break;
    default:
}
imagejpeg($myImage, NULL, 100);
imagedestroy($myImage);

?>

og du kan teste den her: http://www.codebreaker.dk/exp/703194.php?filename=http://www.rappid.org.uk/images/homepage/dummy.jpg&size=1

1 = 25%
2 = 50%
3 = 75%
og intet = normal størrelse
Avatar billede hurra Novice
17. april 2006 - 13:17 #3
hrmortensen: Ja, jeg ved at det variabel navn nok er noget misvisende. Det hjælper nok hvis i lige får resten af koden:
<?
include "inc/files.inc";

if(isset($_GET['size']))
{
  if($_GET['size'] == 1) //preview
      $path = GetCachedFilename($_GET['path'], $_GET['filename'], $PreviewWidth, $PreviewHeight);
  else//if($_GET['size'] == 2) //thumb
      $path = GetCachedFilename($_GET['path'], $_GET['filename'], $ThumbWidth, $ThumbHeight);
}
else
{
  $path = urldecode($picdir.$_GET['path'].$_GET['filename']);
}

//echo $path;
$im = imagecreatefromjpeg($path);
//header("Content-type: image/jpeg");
imagejpeg($im);
imagedestroy($im);
?>

jakobdo: Jeg syntes vores kode ser rimelig ens ud.

Der er ikke meget i det, og der er ikke mange steder der er noget der kan gå galt mener jeg ikke.

Jeg har prøvet at udkommentere den "echo $path" linie, og kopiere det den skriver op i adresse baren, så viser den det rigtige billed, så jeg er helt sikker på at variablen $path indeholder det den burde.

Jeg har prøvet at udkommentere header() linien, så får jeg en masse skrammel tilbage, som godt kunne minde om dataet i et jpeg, og jeg kan ikke se den skriver noget om nogle fejl nogle steder der i. Den er bare skide sur.

Jeg har lige opdateret GDd og php fornylig, det gav en masse mærkelige ting i kølvandet af det. Kan det her være en anden ting, at min fejl simpelt hen er en opsætnings fejl ?
Avatar billede jakobdo Ekspert
17. april 2006 - 13:20 #4
Hurra: Prøv at brug: LoadJpeg og ikke imagecreatefromjpeg() den giver nemlig en fejl, hvis det ikke lykkedes at loade filen korrekt.
Avatar billede hurra Novice
17. april 2006 - 13:30 #5
Det har jeg lige prøvet, det er nødagtigt det samme. Og hvis jeg fjerner header() linien, kan jeg stadig se noget der minder om dataet i billedet.
Avatar billede jakobdo Ekspert
17. april 2006 - 14:00 #6
Prøv at test noget så simpelt som:

<?php
//http://www.eksperten.dk/spm/703194

header("Content-type: image/jpeg");
$im = imagecreatefromjpeg('http://www.rappid.org.uk/images/homepage/dummy.jpg');
imagejpeg($im);
imagedestroy($im);

?>

Kan du få det til at virke?
Avatar billede hurra Novice
17. april 2006 - 14:08 #7
Vildt, det virker :) Men det er meget meget mærklig,  det her virker:
<?
header("Content-type: image/jpeg");
$im = imagecreatefromjpeg('./pic/2/dsc_7874.jpg');
imagejpeg($im);
imagedestroy($im);
?>
<?
/*include "inc/files.inc";

if(isset($_GET['size']))
{
  if($_GET['size'] == 1) //preview
      $path = GetCachedFilename($_GET['path'], $_GET['filename'], $PreviewWidth, $PreviewHeight);
  else//if($_GET['size'] == 2) //thumb
      $path = GetCachedFilename($_GET['path'], $_GET['filename'], $ThumbWidth, $ThumbHeight);
}
else
{
  $path = urldecode($picdir.$_GET['path'].$_GET['filename']);
}

//echo "<img src='$path'>";
//$im = imagecreatefromjpeg($path);
*/
?>
Men det her virker ikke..

<?
/*include "inc/files.inc";

if(isset($_GET['size']))
{
  if($_GET['size'] == 1) //preview
      $path = GetCachedFilename($_GET['path'], $_GET['filename'], $PreviewWidth, $PreviewHeight);
  else//if($_GET['size'] == 2) //thumb
      $path = GetCachedFilename($_GET['path'], $_GET['filename'], $ThumbWidth, $ThumbHeight);
}
else
{
  $path = urldecode($picdir.$_GET['path'].$_GET['filename']);
}

//echo "<img src='$path'>";
//$im = imagecreatefromjpeg($path);
*/
?>
<?
header("Content-type: image/jpeg");
$im = imagecreatefromjpeg('./pic/2/dsc_7874.jpg');
imagejpeg($im);
imagedestroy($im);
?>
Avatar billede hurra Novice
17. april 2006 - 14:12 #8
Altså den eneste forskel der er, er om det der viser billeder kommer før eller efter alt det jeg har udkomemnteret.
Avatar billede jakobdo Ekspert
17. april 2006 - 14:17 #9
Kan det tænkes du har noget output i din include fil?
Avatar billede hurra Novice
17. april 2006 - 14:27 #10
Det må jeg jo næsten ha, jeg har prøvet at barbere alt væk, om sætte de funktioner ind i mit script jeg skal bruge. Det eneste jeg har i min include fil nu er:
<?
//global $ThumbWidth;
//global $ThumbHeight;
$ThumbWidth = 181;
$ThumbHeight = 120;

//global $PreviewWidth;
//global $PreviewHeight;
$PreviewWidth=600;
$PreviewHeight=500;

//global $rowcount;
$rowcount = 5;

//global $tablesettings;
$tablesettings = "cellspacing='8' cellpadding='5'";
//global $tdsettings;
$tdsettings = "align=center bgcolor='#e4e8f1'";

//global $picdir;
$picdir = "./pic/";

//define("FILES_PR_PAGE", 20);
?>
Det skulle jo ikke kunne gøre noget. Men aligevel virker det ikke hvis jeg includere filen. Men hvis jeg copy/paster det over i mit script virker det fint.

Jeg er vidst ved at være så langt ude i det her at fejlen er lokaliceret, jokobdo du fortjener nogle points, sender du et svar ?
Avatar billede hurra Novice
17. april 2006 - 14:30 #11
Jeg har lige prøvet et lille forsøg. Hvis jeg kikker i soursen (altså det som i det her tilfælde er bileld dataen) for det der virker og det der ikke virker, starter det der ikke virker med at lave et linieskift.
Avatar billede jakobdo Ekspert
17. april 2006 - 14:32 #12
Jeg kan desværre ikke sige hvorfor den include giver fejl, for den ser rigtig ud.
Prøv som en test at fjern alle komments, så din fil bliver til:

<?
$ThumbWidth = 181;
$ThumbHeight = 120;
$PreviewWidth=600;
$PreviewHeight=500;
$rowcount = 5;
$tablesettings = "cellspacing='8' cellpadding='5'";
$tdsettings = "align=center bgcolor='#e4e8f1'";
$picdir = "./pic/";
?>

Og her et svar.
Avatar billede hurra Novice
17. april 2006 - 14:53 #13
Jeg har lige prøvet at lave en ny tom text fil. Hvis jeg lavede 1 linie skift i den file, og includerede den, virkede det ikke, men uden linieskift i filen var der ingen problem.

Så prøvede jeg at oprette nogle variabler i den fil, og det virkede om, så jeg kopierede alt indholdet af min include fil over i den, og det virkede stadig vær. Så prøvede jeg igen med min include fil, og det hele fejlede, derefter prøvede jeg at kopiere alt indholdet fra den fil der jo ellers indholdt alt indholdet fra min include fil, tilbage igen, og nu virker det hele..... Det giver slet ingen mening det her.
Avatar billede hurra Novice
17. april 2006 - 14:53 #14
Men tak for hjælpen og din tid.
Avatar billede jakobdo Ekspert
17. april 2006 - 14:54 #15
Hehe, php kan drille, men oftest gør det desværre ikke andet end det har fået besked på! :o)

Og takker for point.
Avatar billede hurra Novice
17. april 2006 - 14:56 #16
Jeg har lige slettet et space til aller sidst (efter ?>) i den include fil jeg oprindelig brugte. Nu virker det som jeg havde da jeg stillede spørgsmålet.
Avatar billede jakobdo Ekspert
17. april 2006 - 15:00 #17
Ja, det skal man huske. Alle whitespaces som bliver outputtet før en header fejler.
Folk laver også tit fejlen:

<?
//noget...
?>

<?
header();
?>

Og de glemmer så mellemrummet mellem: ?> og <?
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