webForumDet fria alternativet

Getimagesize på bilder skapade av GD?

PHPur PHP

19 svar · 385 visningar · startad av muskot

Medlem sedan jan. 20027 905 inlägg
Frågan#1

Har gjort ett skript som med hjälp av GD gör dynamiska thumbnails av stora bilder. Dessa thumbnails visar jag på en annan sida där jag även vill köra getimagesize för att få höjd och bredd till img-taggarna. Använder följande kod:

$thumb_res = getimagesize ("thumb.php?img=test.jpg");

Men det fungerar inte. Får följande meddelande:

Warning: getimagesize(thumb.php?img=test.jpg) [function.getimagesize]: failed to create stream: Invalid argument in D:\wwwroot\img\browse.php on line 56

Har även provat att ge getimagesize en hel URL, men det fungerar inte heller. Några andra idéer?

Medlem sedan dec. 2002789 inlägg
#2

Får du samma fel om du bara skriver:

$thumb_res = getimagesize ("test.jpg");
Medlem sedan jan. 20027 905 inlägg
#3

Darren skrev:

Får du samma fel om du bara skriver:

$thumb_res = getimagesize ("test.jpg");

Ja, då fungerar det bra, glömde nämna det. Fast då anges ju originalstorleken på bilden. Felet uppkommer bara när jag blandar in mitt thumbnailskript.

Medlem sedan dec. 2002789 inlägg
#4

Kan inte du använda dig utav en funktion som returnerar thumnail bredden och höjden istället för att använda dig utav extern php-fil?

Medlem sedan jan. 20027 905 inlägg
#5

Det kanske går, har dock noll koll på hur man gör egna funktioner.

Medlem sedan dec. 2002789 inlägg
#6

Kan du visa koden som du har i thumb.php?

Medlem sedan jan. 20027 905 inlägg
#7

thumb.php:

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

$scale = 10; 
$img = $HTTP_GET_VARS['img'];
$dir = $HTTP_GET_VARS['dir'];
 
$img_in = ImageCreateFromJPEG("$dir$img"); 

$img_width = ImageSX($img_in) / $scale; 
$img_height = ImageSY($img_in) / $scale; 

$img_out = ImageCreateTrueColor($img_width, $img_height); 
ImageCopyResized($img_out, $img_in, 0, 0, 0, 0, $img_width, $img_height, ImageSX($img_in), ImageSY($img_in)); 
ImageJPEG($img_out); 

ImageDestroy($img_in); 
ImageDestroy($img_out); 

exit;
?>
Medlem sedan dec. 2002789 inlägg
#8

Spara koden nedan som lib.php

<?php 
function resizeImage($dir,$img){
   header("Content-type: image/jpeg"); 

   $scale = 10; 
 
   $img_in = ImageCreateFromJPEG("$dir$img"); 

   $img_width = ImageSX($img_in) / $scale; 
   $img_height = ImageSY($img_in) / $scale; 

   $img_out = ImageCreateTrueColor($img_width, $img_height); 
   ImageCopyResized($img_out, $img_in, 0, 0, 0, 0, $img_width,$img_height, ImageSX($img_in), ImageSY($img_in)); 
   ImageJPEG($img_out); 

   ImageDestroy($img_in); 
   ImageDestroy($img_out); 

   return array ($img_width, $img_height);
}
?>

I filen som skall använda sig av resizeImage funktionen skriver du:

<?php
   include("lib.php");

// istället för att göra getimagesize här gör du:
   $width = resizeImage('din_mapp','din_bild.jpg')[0];
   $height = resizeImage('din_mapp','din_bild.jpg')[1];
?>

Har inte testat detta men jag hoppas att det fungerar... :)

Medlem sedan jan. 20027 905 inlägg
#9

Tack, tack.. Får dock inte anropet till funktionen att fungera. Har testat med både " och ' med samma resultat:

Parse error: parse error in D:\wwwroot\img\test.php on line 5

<?php
   include("lib.php");

// istället för att göra getimagesize här gör du:
   $width = resizeImage('bilder/','test.jpg')[0];
   $height = resizeImage('bilder/','test.jpg')[1];
?>
Medlem sedan dec. 2002789 inlägg
#10

Testa detta då...

<?php
   include("lib.php");

   $directory = "bilder/";
   $image  = "test.jpg";

   $width = resizeImage ($directory, $image)[0];
   $height = resizeImage ($directory, $image)[1];

//   För att testa så kan du göra en echo här:
   echo "bredd: $width<br>höjd: $height";
?>

Lägg till en mellanslag i den här raden i lib.php.

function resizeImage ($dir, $img){
Medlem sedan jan. 20027 905 inlägg
#11

Får tyvärr samma fel, fast på rad 7...

Medlem sedan dec. 2002789 inlägg
#12

Jag är nog inte riktigt vaken här...

<?php
include("lib.php");

$directory = "bilder/";
$image  = "test.jpg";

$img_size = resizeImage ($directory, $image);

echo $img_size[0].'<br>'.$img_size[1]
?>
Medlem sedan jan. 20027 905 inlägg
#13

Inga felmeddelanden nu i alla fall. Dock returneras endast en thumbnail av bilden. Inte höjd/bredd.

Medlem sedan dec. 2002789 inlägg
#14

Skall ta och testa det lite mer här hemma... Återkommer.

Medlem sedan dec. 2002789 inlägg
#15

Det fungerar hur bra som helst på min dator... Jag får tillbaka bredden och höjden.

Det enda som inte fungerade på min maskin var raden nedan

$img_out = imagecreatetruecolor($img_width, $img_height);

så jag ändrade den till:

$img_out = imagecreate($img_width, $img_height);
Medlem sedan dec. 2002789 inlägg
#16

Ändra lib.php så att den ser ut så här:

<?php 
function resizeImage($dir,$img){
   header("Content-type: image/jpeg"); 

   $scale = 10; 
 
   $img_in = ImageCreateFromJPEG("$dir$img"); 

   global $img_width;
   global $img_height;

   $img_width = ImageSX($img_in) / $scale; 
   $img_height = ImageSY($img_in) / $scale; 

   $img_out = ImageCreateTrueColor($img_width, $img_height); 
   ImageCopyResized($img_out, $img_in, 0, 0, 0, 0, $img_width,$img_height, ImageSX($img_in), ImageSY($img_in)); 
   ImageJPEG($img_out); 

   ImageDestroy($img_in); 
   ImageDestroy($img_out); 
}
?>

Nu är $img_width och $img_height variabler sk globala variabler så då kan du anropa de direkt i test.php

   $directory = "bilder/";
   $image  = "test.jpg";

   $tmp = resizeImage ($directory, $image);

// här skriver vi ut dina bredd och höjd variabler
   echo $img_width.'<br>'.$img_height;

Och i den förra förslaget du fick (som fungerar på min dator men inte på din) glömde jag kommatecken på sista raden... Det kan vara därför det inte fungerar hos dig...

Medlem sedan jan. 20027 905 inlägg
#17

Fattar inte varför det inte fungerar hos mig... När jag kör de nya förslagen får jag bara:

Warning: Cannot modify header information - headers already sent by (output started at D:\wwwroot\img\lib.php:26) in D:\wwwroot\img\lib.php on line 3

Följt av en massa skräptecken som förmodligen är jpeg-bilden.

Om jag lägger till ob_start("ob_gzhandler"); högst upp i koden får jag bara en "bruten" bild som output.

<?php
ob_start("ob_gzhandler");

include("lib.php");

$directory = "bilder/";
   $image  = "test.jpg";

   $tmp = resizeImage ($directory, $image);

// här skriver vi ut dina bredd och höjd variabler
   echo $img_width.'<br>'.$img_height;
?>

Blir galen på detta, speciellt som det fungerar för dig. Det kanske är en versions- eller plattformsspecifik bug som spökar?

Medlem sedan dec. 2002789 inlägg
#18

Här har du lite uppgifter om min konfiguration...

Windows XP home
Apache 2.43
PHP 4.3.0 dev (build Nov 28 2002)
Zend Engine: 1.3.0
GD version: bundled (2.0 compatible)

Medlem sedan jan. 20027 905 inlägg
#19

Hm, skumt, tänkte att du körde *nix. Men vi kör ju nästan samma, förutom att jag kör Win2k Server och PHP 4.3.0RC3 (Build date Dec 12 2002 01:20:01).

Fattar ingenting...

Edit:
Skulle vara evigt tacksam om andra som läser det här har lust testa ovanstående kod och sedan rapportera tillbaka serverkonfiguration och huruvida det fungerar/inte fungerar. Eller om någon har andra förslag på lösningar...
Ska själv installera 4.3.0-final på måndag och se om det avhjälper problemet.
Ett stort tack till Darren i alla fall, hoppas bara att jag också kan få det att fungera...

Medlem sedan jan. 20027 905 inlägg
#20

Nu har jag installerat PHP 4.3.0 final och får inte längre några felmeddelanden med den senaste koden Darren bidrog med. Dock får jag fortfarande inte ut höjd och bredd, utan bara, som tidigare, en miniatyrversion av bilden. Så här blir det alltså: http://cnull.com/img/test.php.
Lägger även ut min phpinfo i fall någon kan se något tokigt i konfigurationen: http://cnull.com/img/phpinfo.php.

140 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)