webForumDet fria alternativet

ImageCopyResize() för långsam

5 svar · 277 visningar · startad av Kullervo

KullervoMedlem sedan juli 200226 inlägg
#1

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.

AsterixMedlem sedan dec. 1999483 inlägg
#2

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.

KullervoMedlem sedan juli 200226 inlägg
#3

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?

MungoMedlem sedan jan. 2000372 inlägg
#4

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?

KullervoMedlem sedan juli 200226 inlägg
#5

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.

MungoMedlem sedan jan. 2000372 inlägg
#6

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!

133 ms totalt · 3 externa anrop · v20260731065814-full.7de19299
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)