[php] thumbnails maken => traag

Pagina: 1
Acties:
  • 105 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • knopper
  • Registratie: September 2001
  • Laatst online: 07-09 23:05

knopper

Sander Knopper

Topicstarter
Hoi allemaal,

Ik heb een script gemaakt dat een directory afgaat en zoekt naar afbeeldingen, vervolgens wordt er gecontroleerd of de breedte niet groter is dan het max. (wat is in te stellen) indien dit wel zo is dan wordt het verkleind.

Vervolgens wordt als het bestand niet verkleind is de afbeelding omgezet in het png formaat (persoonlijke voorkeur) en wordt er een thumbnail van gemaakt. Dit alles wordt vervolgens naar een directory gekopieerd waar een foto-album script in kijkt.

Nu heb ik even getest met 5 afbeeldingen van redelijke grootte en het kost ruim 4 seconden om dit alles te doen. Dit vind ik persoonlijk nogal traag echter het is natuurlijk een eenmalig proces dus dat scheelt.

Hier wat functies die ik gebruik:

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php

function convertjpgtopng ($src_image, $dst_image) {

    global $orig_width, $orig_height;

    $orig_image = imagecreatefromjpeg ($src_image);
    imagepng ($orig_image, $dst_image);

    imagedestroy ($orig_image);
}

function imageresizefromjpg ($src_image, $dst_image) {

    global $orig_width, $orig_height, $new_width;

    $new_height = round (($orig_height * $new_width) / $orig_width);

    $orig_image = imagecreatefromjpeg ($src_image);
    $new_image = imagecreatetruecolor ($new_width, $new_height);
    imagecopyresampled ($new_image, $orig_image, 0, 0, 0, 0, $new_width, $new_height, $orig_width, $orig_height);
    imagepng ($new_image, $dst_image);

    imagedestroy ($orig_image);
    imagedestroy ($new_image);

}

function imageresizefrompng ($src_image, $dst_image) {

    global $orig_width, $orig_height, $new_width;

    $new_height = round (($orig_height * $new_width) / $orig_width);

    $orig_image = imagecreatefrompng ($src_image);
    $new_image = imagecreatetruecolor ($new_width, $new_height);
    imagecopyresampled ($new_image, $orig_image, 0, 0, 0, 0, $new_width, $new_height, $orig_width, $orig_height);
    imagepng ($new_image, $dst_image);

    imagedestroy ($orig_image);
    imagedestroy ($new_image);

}

function imagesize ($image) {

    $info = getimagesize ($image);

    $width = $info[0];
    $height = $info[1];
}

function imagetype ($image) {

    $imageinfo = exif_imagetype ($image);

    if ($imageinfo == 2) {

        return "jpg";
    }

    elseif ($imageinfo == 3) {

        return "png";
    }

    else {

        return FALSE;
    }

}    

?>


Hier het eigenlijke script:

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
<?php

function getmicrotime() {

    list($usec, $sec) = explode(" ",microtime());
    return ((float)$usec + (float)$sec);
}

$time_start = getmicrotime();

error_reporting (E_ALL);

require ("imagefunctions.php");

// Config

$thumb_width = 150; // Define width of thumbnail in pixels. We don't care about height, it will scale automatically.

$maxwidth = 800; // Maximum width of full screen image in pixels.

// End Config


// Show this first so that people can specify the album name they want to create

if (!isset ($_POST['submit'])) {

?>

        <html>
        <head>
        <title>Generate album</title>
        </head>

        <body>

        <form method="post" action="upload.php">

        <input type="hidden" name="submit" value="1" />

        Please specify the name of the album:<br />
        <input type="text" name="albumname" size="25" maxlength="40" />
        <input type="submit" value="Send" />

        </form>

        </body>

        </html>

<?php

}

// Check if people have submitted the album name and continue if so

if (isset ($_POST['submit']) && $_POST['submit'] == 1) {

    $albumname = $_POST['albumname'];

    // Initialize counter for creating file names later on

    $num = 0;

    // Create directory for album

    if (mkdir ($albumname, 0775)) {

        echo    "<b>Info: </b>Albumdirectorie is aangemaakt...<br /><br />\n";
    }

    else {

        echo    "<b>Fout: </b>Albumdirectorie kon niet worden aangemaakt.<br />Misschien bestaat de directorie al of heb je niet genoeg rechten.<br /><br />\n";
        // If can't create directory => abort
        
        die ();
    }

    // Open directory handler
    
    if ($uploaddir = opendir ("uploads")) {

        // Walk trough directory

        while (false !== $file = readdir ($uploaddir)) {

            if ($file != "." && $file != "..") { // Skip common linux files

                // Fetch image type and validate
                
                list ($orig_width, $orig_height, $ext, $attr) = getimagesize ("uploads/" . $file);

                echo $orig_width . "<br />" . $orig_height . "<br />" . $ext . "<br />";

                switch ($ext) {

                    case "jpg" || "png";
                    
                    $valid = TRUE;
                    break;

                    case FALSE;

                    echo    "<b>Fout: </b>" . $file . " is geen afbeelding.<br />\n";
                    $valid = FALSE;
                    break;
                }

                // When valid, check width and adjust if needed. Copy to destination dir if adjusted
                
                if ($valid) {

                    if ($orig_width > $maxwidth) {

                        echo    "<b>Info: </b>" . $file . " is groter dan de max. breedte, dit zal worden aangepast.<br />\n";
                        $resize = TRUE;

                        $new_width = $maxwidth;

                        switch ($ext) {

                            case "jpg";

                            imageresizefromjpg ("uploads/" . $file, $albumname . "/" . $num . ".png");
                            break;

                            case "png";

                            imageresizefrompng ("uploads/" . $file, $albumname . "/" . $num . ".png");
                            break;
                        }
                        
                        unset ($new_width);

                        $resized = TRUE;                    
                    }

                    // If image hasn't been resized, copy it to destination dir.

                    if (!isset ($resized)) {

                        switch ($ext) {

                            case "png";
                            if (!copy ("uploads/" . $file, $albumname . "/" . $num . ".png")) {

                                echo "<b>Fout: </b>Kon bestand niet kopieren naar albumdirectorie.<br />\n";

                                die ();
                            }
                            break;

                            case "jpg";
                            convertjpgtopng ("uploads/" . $file, $albumname . "/" . $num . ".png");
                            break;
                        }
                    }

                    // Create thumbnails and copy to destination dir

                    $new_width = $thumb_width;

                    switch ($ext) {

                        case "jpg";
                        imageresizefromjpg ("uploads/" . $file, $albumname . "/" . $num . ".thumb.png");
                        break;

                        case "png";
                        imageresizefrompng ("uploads/" . $file, $albumname . "/" . $num . ".thumb.png");
                        break;
                    }

                    // Output succes message and increase file name number

                    echo    "<b>Info :</b> " . $file . " is succesvol in het album gezet.<br /><br />\n";

                    $num++;
                    
                } // End if ($valid bla
            
            } // End if ($file != "." bla
        
        } // End while ($file bla)
    
    } // End if (opendir bla)

    else {

        echo    "<b>Fout: </b>Kon de uploaddirectorie niet openen. Controleer de rechten...<br /><br />\n";
    }

}

$time_end = getmicrotime();
$time = $time_end - $time_start;

echo    "Uitvoeren van script kostte {$time} seconden";

?>


Hoort dit zo lang te duren of kan iemand iets vinden waardoor het significant sneller zou kunnen gaan?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Als de snelheid je boeit zou je imagecopyresized() kunnen gebruiken in plaats van imagecopyresampled(), maar daarmee gaat gelijk de kwaliteit van je afbeelding omlaag. Verder is de GD2 library gewoon niet een van de snelste, dus ik ben bang dat het niet sneller kan dan dit, als je GD wil blijven gebruiken.
Vraag even na of je host ImageMagick ondersteunt. Als ze dat geïnstalleerd hebben, dan kun je via een shell commando resizen, en dat gaat zeker 10x sneller. :)
edit:
Je doet trouwens nogal veel dingen op basis van de extensie van de image die je binnen krijgt. Kijk liever naar het MIME-type. Dat is misschien ook niet echt een zekerheid dat wat je binnen krijgt klopt, maar het is meer zekerheid dan met de extensie alleen.

[ Voor 23% gewijzigd door NMe op 18-07-2004 13:14 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 14:39

Johnny

ondergewaardeerde internetguru

Voor thumbnails (kleiner dan 120 pixels) vind ik imagecopyresized() vaak een mooier resultaat geven dan imagecopyresampled() omdat hij dan niet zo onscherp wordt.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • knopper
  • Registratie: September 2001
  • Laatst online: 07-09 23:05

knopper

Sander Knopper

Topicstarter
Bedankt voor je antwoord, over die extensie, zoals je in de functies kunt zien wordt m.b.v. "exif_imagetype()" gecontroleerd wat voor bestand het is en daarna wordt aan de variabele "$ext" de juiste extensie geplakt. Naar mijn idee is dit een redelijke methode want exif_imagetype() kijkt niet naar de extensie lijkt me of niet soms?

Ik draai zelf een linux server dus ik kan zo even ImageMagick erop gooien, maakt dat echt zo'n groot verschil met de GD library? Zijn daar misschien ook php functies voor? (om imagemagick te gebruiken dus..)

Hiervoor gebruikte ik idd imagecopyresized() maar de thumbs die daaruit kwamen waren echt niet om aan te zien dus dat heb ik snel veranderd...:D

edit: mijn thumbs zijn op het moment dus 150px breed en de hele afbeelding werd vervormd. Rechte vormen werden krom en dat soort dingen, dus ik vond dat niet echt een optie.

[ Voor 14% gewijzigd door knopper op 18-07-2004 13:21 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

knopper schreef op 18 juli 2004 @ 13:19:
Bedankt voor je antwoord, over die extensie, zoals je in de functies kunt zien wordt m.b.v. "exif_imagetype()" gecontroleerd wat voor bestand het is en daarna wordt aan de variabele "$ext" de juiste extensie geplakt. Naar mijn idee is dit een redelijke methode want exif_imagetype() kijkt niet naar de extensie lijkt me of niet soms?
Nee, klopt, heb ik overheen gelezen. :)
knopper schreef op 18 juli 2004 @ 13:19:
Ik draai zelf een linux server dus ik kan zo even ImageMagick erop gooien, maakt dat echt zo'n groot verschil met de GD library? Zijn daar misschien ook php functies voor? (om imagemagick te gebruiken dus..)
Om IM te gebruiken moet je het alleen op je server installen en dan aanroepen met een shell commando, volgens mij was dat zoiets:
PHP:
1
passthru("convert -antialias -geometry ".$width."x".$height." ".escapeshellcmd($image)." png:-");

Althans, dit is als je een stream wil hebben. Vervang de png:- achteraan door een filenaam als je een file wil maken.

[ Voor 20% gewijzigd door NMe op 18-07-2004 13:26 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • knopper
  • Registratie: September 2001
  • Laatst online: 07-09 23:05

knopper

Sander Knopper

Topicstarter
Ok, thanx. Ga ik me daar eens in verdiepen...;)

Acties:
  • 0 Henk 'm!

Verwijderd

In plaats van Image Magick kun je ook Netpbm gebruiken.
Mijn hoster vertelde me dat dit sneller is dat Image Magick en dat het ook minder geheugen gebruikt. Wij hebben een vrij intensieve website met foto's en thumbnails en sinds ik Netpbm gebruik is de server geen enkele keer meer vastgelopen.

Natuurlijk met Netpbm wel op de server actief zijn, dus dat zul je moeten navragen.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Op deze site staat anders precies het tegenovergestelde. Volgens een poster daar is netpbm juist weer trager dan IM. Je zou het kunnen testen natuurlijk. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1