[PHP] Thumbnailer

Pagina: 1
Acties:

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Ik heb vanmiddag eens even zitten stoeien met PHP en vroeg me af of onderstaande script een beetje goed in elkaar zit.
Ik heb hier niet de mogelijkheid om te testen, maar dat is ook niet echt de vraag. Mijn vraag is meer of ik dingen efficienter zou kunnen doen.
Hebben jullie hier nog op of aanmerkingen?
Misschien dat iemand het makkelijk vind om te gebruiken.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?
# script usage: Just calling image.php without any variables display's an error
# Calling the script with a filename (.jpg) returns the image exactly how it is
# Calling the script with a filename, width and height will resize the original image
# save it to the media dir with a prefix of the width and height an display it

switch ($type) {
    case (!isset($type))
        #Output the original image
        GenJPG();
    case ($type == "small")
        # Output a thumbnail (200 x 150)
        GenJPG(200,150);
    case ($type == "medium")
        # Output a medium sized image (800 x 600)
        GenJPG(800,600);
}

function GenJPG($ImgWidth, $ImgHeight, $filename) {
# Function to generate new images based on existing images. Only with a different size.
$SmallDir = "media/200150/"; # Directory that contains the small images
$MediumDir = "media/800600/"; # Directory that contains the medium images

    if ((!isset($filename))) {
        #No filename specified
        echo "ERROR: Filename not specified!";
    } else {
        #Filename specified
        if (!isset($ImgWidth) or !isset($ImgHeight)) {
            #ImgWidth or ImgHeight is not set, so display the original image.
            Header("Content-type: image/jpeg");
            $im = ImageCreateFromJPEG("media/".$filename);
            ImageJPEG($im,'',90);
            ImageDestroy($im);
        } else {
            #ImgWidth and ImgHeight is set, so check if there is allready a file with the right size
            #Or else generate a new image with new dimensions and save it to the appropiate folder.
            #Finally display it.
            if (is_file("media/".$ImgWidth.$ImgHeight."-".$filename) {
                #File allready exists. So display it right away.
                Header("Content-type: image/jpeg");
                $im = ImageCreateFromJPEG("media/".$ImgWidth.$ImgHeight."-".$filename);
                ImageJPEG($im,'',90);
                ImageDestroy($im);
            } else {
                #BLAAT!
                Header("Content-type: image/jpeg");
                $im = ImageCreateFromJpeg("media/".$filename);
                $im_tmp = ImageCreate($ImgWidth, $ImgHeight);
                imagecopyresized($im_tmp, $im, 0, 0, 0, 0, $ImgWidth, $ImgHeight, imagesx("media/".$filename), imagesy("media/".$filename))
                imagejpeg($im_tmp, "media/".$ImgWidth.$ImgHeight."-".$filename, 90)
                imagejpeg($im_tmp,'', 90)
                imagedestroy($im)
            }
        }
    }
}
?>

  • Grum
  • Registratie: Juni 2001
  • Niet online
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?
error_reporting(E_ALL);
 
if(!isset($filename)) die('filename ?!');
if(!isset($type))     $type = '';
 
switch ($type) { 
    case 'small':          # Output a thumbnail (200 x 150)
        GenJPG($filename, 200, 150);
        break;
 
    case 'medium':         # Output a medium sized image (800 x 600)
        GenJPG($filename, 800, 600);
        break;
 
    default:               # Output original image
        GenJPG($filename);
}
?>

de rest komt zo in een edit :P

en zoals beloofd (ongetest, korter, minder foutjes)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?
function GenJPG($inFileName, $inWidth = 0, $inHeight = 0) 
{
    if (!$inWidth || !$inHeight)      
        $theImage = ImageCreateFromJPEG("media/$inFileName");   
    else 
    {
        if (is_file("media/$ImgWidth$ImgHeight-$inFileName")) 
            $theImage = ImageCreateFromJPEG("media/$ImgWidth$ImgHeight-$inFileName");
        else 
        {
            $tmpImage = ImageCreateFromJPEG("media/$inFileName");
            $theImage = ImageCreate($ImgWidth, $ImgHeight);
 
            ImageCopyResized($theImage, $tmpImage, 0, 0, 0, 0, $inWidth, $inHeight, ImageSX("media/$inFileName"), ImageSY("media/$inFileName"));
            ImageDestroy($tmpImage);
            ImageJPEG($theImage, "media/$ImgWidth$ImgHeight-$inFileName", 90);
        }
    }
 
    Header("Content-type: image/jpeg");
    ImageJPEG($theImage,'', 90);
    ImageDestroy($theImage);
}
?>

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Heb het bijna voor elkaar...

Heb nu dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?
error_reporting(E_ALL);

if(!isset($filename)) die('filename ?!');
if(!isset($type)) {
    $type = '';
}
    switch ($type) {
        case 'small':    # Output a thumbnail (200 x 150)
            GenJPG($filename, 200, 150);
            break;
        case 'medium':    # Output a medium sized image (800 x 600)
            GenJPG($filename, 800, 600);
            break;
        default:        # Output original image
            GenJPG($filename);
    }
?>


<?
function GenJPG($inFilename, $inWidth = 0, $inHeight = 0) {
    if (!$inWidth || !$inHeight) {
        $theImage = ImageCreateFromJPEG("media/$inFilename");
        } else {
            if (is_file("media/$inWidth$inHeight-$inFilename")) {
                $theImage = ImageCreateFromJPEG("media/$inWidth$inHeight-$inFilename");
            } else {
                $tmpImage = ImageCreateFromJPEG("media/$inFilename");
                $theImage = ImageCreate($inWidth, $inHeight);
                ImageCopyResized($theImage, $tmpImage, 0, 0, 0, 0, $inWidth, $inHeight, ImageSX("media/$inFilename"), ImageSY("media/$inFilename"));
                ImageDestroy($tmpImage);
                ImageJPEG($theImage, "media/".$inWidth.$inHeight."-".$inFilename, 90);
            }
        }
        Header("Content-type: image/jpeg");
        ImageJPEG($theImage,'', 90);
        ImageDestroy($theImage);
    }
?>

Het enige probleem is nu dat hij dit geeft:
code:
1
2
3
4
5
6
7
8
9
10
Warning: Supplied argument is not a valid Image resource in C:\Inetpub\wwwroot\image.php on line 31

Warning: Supplied argument is not a valid Image resource in C:\Inetpub\wwwroot\image.php on line 31

Warning: Supplied argument is not a valid Image resource in C:\Inetpub\wwwroot\image.php on line 31

Warning: Supplied argument is not a valid Image resource in C:\Inetpub\wwwroot\image.php on line 32

Warning: Cannot add header information - headers already sent by (output started at C:\Inetpub\wwwroot\image.php:29) in C:\Inetpub\wwwroot\image.php on line 36
ÿØÿàJFIFÿþ;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 90 ÿÛC     ÿÛC   ÿÀÈ"ÿÄ ÿĵ}!1AQa"q2¡#B±ÁRÑð$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz¢£€¥Ŝ§š©ª²³Žµ¶·ž¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz¢£€¥Ŝ§š©ª²³Žµ¶·ž¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?üª¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(ÿÙ

  • Grum
  • Registratie: Juni 2001
  • Niet online
* Grum pakt zijn glazen bol en ziet automagisch wat line 31 is

Ik heb gewoon gepakt wat jij had gecode, gepoogd de logica erin te zien (dat deels gedaan) en dat 'hercode' op 'mijn' manier.

Maareuh die error wijst op dat er IETS fout is met het openen/aanmaken van een image.

edit:
IEK! - eventjes voor jij de source pakte heb vond ik nog een foutje (of wat ;) ) dus je moet ff overnieuw de source pakken :P )


[edit2]ik vond nog een foutje ;)[/edit]

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Het is de regel:
code:
1
ImageCopyResized($theImage, $tmpImage, 0, 0, 0, 0, $inWidth, $inHeight, ImageSX("media/$inFileName"), ImageSY("media/$inFileName"));

Ik snap het niet... De inhoud van $tmpImage is: Resource id #1
Dus dat zal wel goed zijn. Hij maakt wel een nieuwe file aan. Maar die is gewoon zwart. Erg vaag...

  • Grum
  • Registratie: Juni 2001
  • Niet online
zoals ik dus zei .. pak m'n code nog es ;)

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Nope... Maakt niks uit... Doet helemaal niks
Zelfde error.. Kutzooi.

Verwijderd

Crewl... ff topic onthouden :) is altijd handig...maaruh ik krijg nog steeds GD2 niet aan de praat... dus kan ik ook niet thumbnailen :{

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Hmz.. Post daar ff een nieuw topic over dan. Dan kunnen we je daar misschien mee helpen.
Ben bang dat de mods hem weer sluiten als je off-topic gaat.

  • Grum
  • Registratie: Juni 2001
  • Niet online
nou

of
$tmpImage = ImageCreateFromJPEG("media/$inFilename");

of
$theImage = ImageCreate($inWidth, $inHeight);

gaat fout .. nu kan je zelf toch wel uitzoeken welke dat is ?

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Wat er fout gaat is niet zo moeilijk. ImageCopyResized gaat fout omdat het blijkbaar in ImageCreateFromJPEG al fout gaat. Er worden namelijk wel zwarte plaatjes aangemaakt, dus ImageCreate gaat wel goed.

De vraag is echter.. WAAROM gaat het fout. En ik zou het niet weten. Alles ziet er goed uit.

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Heb ik weer... Ik snap er echt geen hol van. Mijn script is niks anders dan andere resize-scripts. Heb alles al 10 keer nagelopen, maar kan de fout niet vinden.

  • Grum
  • Registratie: Juni 2001
  • Niet online
bestaat: media/$inFilename ? :P

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Ja... Ook als ik de pagina refresh komt er netjes de thumbnail te staan. Alleen niet de echte, maar een zwart vlak van 200 x 150.

  • Grum
  • Registratie: Juni 2001
  • Niet online
:? (ik volg je even niet)

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Oke.. Let op... Als ik de pagina aanroep dan geeft ie bovenstaande foutmelding dat $tmpImage geen geldige Image Source is. Echter hij creert wel een nieuwe image van 200 x 150 en maakt die gewoon helemaal zwart. Als ik dan de pagina refresh krijg ik i.p.v. foutmeldingen een zwart blok van 200 x 150 te zien. Dus dat is op zich goed, maar als $tmpImage nou een geldige Image Source zou zijn, dan zou ik geen errors krijgen en zou gewoon mijn JPEG verkleind worden i.p.v. een zwart gat.

  • Grum
  • Registratie: Juni 2001
  • Niet online
en je weet meer dan 500% zeker dat media/$inFilename bestaat ?

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Hmz. Zal vanavond eens een script maken zodat ik het zeker weet. Dan zet ik gewoon het volledige pad er in.

[EDIT]
O ja... Wat ik ook nog had gevonden...
ImageSX
(PHP 3, PHP 4 >= 4.0.0)

ImageSX -- Get image width
Description
int imagesx ( int im)
ImageSX() returns the width of the image identified by im.
En in mijn script staat er gewoon een verwijzing naar een file als identifier. Das dus nie goed. Wellicht dat daar die error vandaan komt.

  • Lurge
  • Registratie: Maart 2000
  • Niet online

Lurge

ActueleWind

Volgens mij krijg je bij deze thumbs problemen als je fotos upload die een heel ander formaat zijn (stuk breder of langer) dan worden ze bij jou helemaal uit z'n verband gerukt volgens mij. Of je moet altijd dezelfde soort fotos gebruiken en geen staande fotos.
Anders word alles heel breeed enzo :)

ActueleWind


  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
In de eerste instantie komen alle foto's rechtstreeks uit mijn digicam en zijn de afmetingen dus gelijk. In een later stadium wil ik ook de mogelijkheid creeren om de foto's te roteren.

  • Grum
  • Registratie: Juni 2001
  • Niet online
daar kwam die error dus indeed vandaan ... maar aangezien ik geen zin had om alles na te gaan zitten kijken (heb wel een beetje vertrouwen in de mede-gotter ;) ) ben ik dat niet tegen gekomen.

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Ik had ook wat problemen met GD2 en ImageCopyResized. Dit heb ik op kunnen lossen door ImageCreate te vervangen door ImageCreateTrueColor en ImageCopyResized te vervangen door ImageCopyResampled.
Dit geeft sowieso mooiere thumbs...

Intentionally left blank


  • Joto
  • Registratie: Juni 2000
  • Laatst online: 11-09 15:14
voor het maken va thumbs, waar de afmetingen goed van zijn doe ik
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?
function ResizePic($SourcePath,$DestPath,$W,$H,$S,$T) {
// $W = Desired Width of PIC out if 0 aspect ratio will be kept    ( $H must be set )
// $H = Desired Height of PIC out if 0 aspect ratio will be kept  ( $W must be set )
// $S = Desired Scale of PIC out 1= 100% .5 = 50% 1.5 = 150% ( over rules $W and $H)
// $T = Desired Thumb of PIC out ( over rules $W and $H and $S)

    $Extent = strtolower( strrchr ( $SourcePath, "."));
    if ($Extent ==".jpg"){$ImIn    = ImageCreateFromJPEG  ($SourcePath);}
    if ($Extent ==".png"){$ImIn    = ImageCreateFromPNG   ($SourcePath);}
    $WI=ImageSX($ImIn);
    $HI=ImageSY($ImIn);      
    if ((isset($T)) and (!$T==0)){ 
        if ($WI>$HI){$W=$T;$H=0;}
        if ($HI>$WI){$H=$T;$W=0;}        
        $S=0;
    }
    if ((isset($S)) and (!$S==0)){ 
        if ($S>4){$S=4;}
        $W=$S*$WI; $H=$S*$HI;
    } 
    if ((!isset($H)) or ($H==0))    {$H=round($W/$WI*$HI);}    
    if ((!isset($W)) or ($W==0))    {$W=round($H/$HI*$WI);}    
    if ($W>3001){$W=200;}
    if ($H>3001){$H=200;}
    $ImOut    = ImageCreate($W,$H);
    ImageCopyResized($ImOut,$ImIn,0,0,0,0,$W,$H,$WI,$HI); 

    ImageJPEG ($ImOut,$DestPath);
    ImageDestroy($ImIn);
    ImageDestroy($ImOut);
}
?>

http://joto.yi.org/pics/?source=true

1+1+1 = 1


  • Grum
  • Registratie: Juni 2001
  • Niet online
ik weet het ik weet het dat ik er nix van mag zeggen .. maar ik heb nu een handvol asprines nodig na et bekijken van die code :)

sorry :+

Voor wat 'uitleg' waarom: [topic=424102/1/25]
Pagina: 1