Jag kör PHP 4.3.2 med tillhörande GD2 på en PII 450Mhz på Redhat9. Att skapa en thumbnail på 200 * 150 pixlar tar 0,7 sekunder med funktionen imagecopyresize(). Det går bara inte - alldeles för långsamt. Vad finns det för alternativ? Jag antar att om man lägger till en egen funktion i PHP:n som endast är till för att göra om storleken på bilder skulle man kunna kunna få det så effektivt att det bara tar en tiondel så lång tid.
ImageCopyResize() för långsam
5 svar · 277 visningar · startad av Kullervo
Måste du göra om thumbnailen hela tiden? Du kan inte spara tumbnailen?
Annars skulle jag föreslå att testa ImageMagick. Det ger iallafall mycket bättre kvalite. Sen om det går fortare vet jag inte.
Jag skapar tumnageln endast en gång och sen lägger jag den i en fil på hårddisken. Det tar ändå för lång tid att skapa tumnageln första gången man vill åt den.
Ska kika på ImageMagic. Ser ganska intressant ut men frågan är om det inte är bättre att lägga ner några timmar extra på att lägga till en egen funktion i PHP-källkoden.
Någon annan som har ett förslag?
Hastigheten på funktionen torde väl bero på hur stor originalbilden är som du ska skala ner? Själv tycker jag inte att 0.7 låter långsamt om bilden är lite stor (vilket väl är troligt eftersom din tumnagel är på 200x150) och att det skulle gå snabbare med en egenskriven funktion låter inte så troligt väl?
Mungo:
nja, det stämmer väl ändå inte? att läsa en bild är inte krävande medans det går åt massor av kraft att beräkna varje ny pixel i den nya bilden. helst skulle den nya bilden beräknas bicubic, men en sån funktion finns inte i GD. om man gör samma sak i photoshop går det fort som tusan även om man gör det bicubic vilket är mycket mer krävande.
Jamen så testa den här då:
function ImageCopyResampleBicubic ($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h)
/*
port to PHP by John Jensen July 10 2001 -- original code (in C, for the PHP
GD Module) by [email]jernberg@fairytale.se[/email]
*/
{
for ($i = 0; $i < 256; $i++) { // get pallete. Is this algoritm correct?
$colors = ImageColorsForIndex ($src_img, $i);
ImageColorAllocate ($dst_img, $colors['red'], $colors['green'], $colors['blue']);
}
$scaleX = ($src_w - 1) / $dst_w;
$scaleY = ($src_h - 1) / $dst_h;
$scaleX2 = $scaleX / 2.0;
$scaleY2 = $scaleY / 2.0;
for ($j = $src_y; $j < $dst_h; $j++) {
$sY = $j * $scaleY;
for ($i = $src_x; $i < $dst_w; $i++) {
$sX = $i * $scaleX;
$c1 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX, (int) $sY + $scaleY2));
$c2 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX, (int) $sY));
$c3 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX + $scaleX2, (int) $sY + $scaleY2));
$c4 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX + $scaleX2, (int) $sY));
$red = (int) (($c1['red'] + $c2['red'] + $c3['red'] + $c4['red']) / 4);
$green = (int) (($c1['green'] + $c2['green'] + $c3['green'] + $c4['green']) / 4);
$blue = (int) (($c1['blue'] + $c2['blue'] + $c3['blue'] + $c4['blue']) / 4);
$color = ImageColorClosest ($dst_img, $red, $green, $blue);
ImageSetPixel ($dst_img, $i + $dst_x, $j + $dst_y, $color);
}
}
}
...men jag har ändå svårt att tro att det skulle gå snabbare. Rapportera gärna hur det går!