webForumDet fria alternativet

Lägga till funktion

PHP

13 svar · 301 visningar · startad av Johan!

Medlem sedan maj 2000156 inlägg
Frågan#1

Jag har ett problem. Jag har gjort ett script som förminskar JPEG bilder med hjälp av "imagecopyresized". Problemet är bara att kvaliten på bilderna blir värdelös (se http://www.dokusapa.nu/bladdra_bilder.php?id=1&nr=2 ).

Jag hittade då en annan funktion på php.net ( http://www.php.net/manual/en/function.imagecopyresized.php ) bland kommentarerna där någon hade lagt till funktionen "imagecopyresizedbicubic" som ska ge bättre kvalitet. Info om hur man lägger till detta var dock begränsad.

Någon som har lust att beskriva hur man går till väga? Vart koden ska kopieras in och hur man komplierar om det sen.

Här är kommentaren/funktionen från php.net

Here is my addition to imagecopyresized 

it implements bicubic interpolation of pixels so the result is much better than the ordinary imagecopyresized ... 

copy it into the src/ext/gd/gc.c and recompile the lib. 
i wish someone could do that so it's included in the "official" release 

it's a really good function to scale down pictures to thumbnails. 

/* {{{ proto int imagecopyresizedbicubic(int dst_im, int src_im, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h) 
Copy and resize part of an image */ 
PHP_FUNCTION(imagecopyresizedbicubic) 
{ 
zval **SIM, **DIM, **SX, **SY, **SW, **SH, **DX, **DY, **DW, **DH; 
gdImagePtr im_dst, im_src; 
int srcH, srcW, dstH, dstW, srcY, srcX, dstY, dstX; 
int i, j; 
int r, g, b, c1,c2,c3,c4,color; 
float sX, sY; 
float scaleX,scaleY,scaleX2,scaleY2; 
GDLS_FETCH(); 

if (ZEND_NUM_ARGS() != 10 || 
zend_get_parameters_ex(10, &DIM, &SIM, &DX, &DY, &SX, &SY, &DW, &DH, &SW, &SH) == FAILURE) 
{ 
WRONG_PARAM_COUNT; 
} 

ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, DIM, -1, "Image", le_gd); 
ZEND_FETCH_RESOURCE(im_src, gdImagePtr, SIM, -1, "Image", le_gd); 

convert_to_long_ex(SX); 
convert_to_long_ex(SY); 
convert_to_long_ex(SW); 
convert_to_long_ex(SH); 
convert_to_long_ex(DX); 
convert_to_long_ex(DY); 
convert_to_long_ex(DW); 
convert_to_long_ex(DH); 

srcX = Z_LVAL_PP(SX); 
srcY = Z_LVAL_PP(SY); 
srcH = Z_LVAL_PP(SH); 
srcW = Z_LVAL_PP(SW); 
dstX = Z_LVAL_PP(DX); 
dstY = Z_LVAL_PP(DY); 
dstH = Z_LVAL_PP(DH); 
dstW = Z_LVAL_PP(DW); 

// kopiera paletten 

for( i=0; i<256; i++ ) { 
gdImageColorAllocate( im_dst, im_src->red[i], im_src->green[i], im_src->blue[i] ); 
}; 

// gdImageCopyResized(im_dst, im_src, dstX, dstY, srcX, srcY, dstW, dstH, srcW, srcH); 

scaleX = (float)(srcW-1) / (float)dstW; 
scaleY = (float)(srcH-1) / (float)dstH; 

scaleX2 = scaleX/2.0f; 
scaleY2 = scaleY/2.0f; 

for( j=0; j<dstH; j++ ) { 
for( i=0; i<dstW; i++ ) { 

sX = (float)i * scaleX; 
sY = (float)j * scaleY; 

c1 = gdImageGetPixel(im_src, (int)(sX), (int)(sY+scaleY2) ); 
c2 = gdImageGetPixel(im_src, (int)(sX), (int)(sY) ); 
c3 = gdImageGetPixel(im_src, (int)(sX+scaleX2), (int)(sY+scaleY2) ); 
c4 = gdImageGetPixel(im_src, (int)(sX+scaleX2), (int)(sY) ); 

r = (im_src->red[c1] + im_src->red[c2] + im_src->red[c3] + im_src->red[c4]) / 4; 
g = (im_src->green[c1] + im_src->green[c2] + im_src->green[c3] + im_src->green[c4]) / 4; 
b = (im_src->blue[c1] + im_src->blue[c2] + im_src->blue[c3] + im_src->blue[c4]) / 4; 

color=gdImageColorClosest(im_dst,r,g,b); 
gdImageSetPixel( im_dst, (i+dstX),(j+dstY), color ); 

}; 
}; 

RETURN_TRUE; 
} 

#endif /* HAVE_LIBGD */

Tacksam för all hjälp! :)

------------------
Johan
WakeNet AB

[Redigerat av Johan! den 03 apr 2001]

Medlem sedan jan. 2000224 inlägg
#2

Jag och en kopis skrev precis en function för att förminska bilderna idag...
Varför klaga? Jag tyckte det blev riktigt snyggt..

<? function generera_bild($storbild)
{
$litenbild_x = 300;
$a = ImageCreateFromJpeg("sökväg till mapp/$storbild");
$storbild_x = ImageSx($a);
$storbild_y = ImageSy($a);
$k = ($litenbild_x/$storbild_x);
$litenbild_y = IntVal($k*$storbild_y);
$litenbild = ImageCreate($litenbild_x,$litenbild_y);
$black = ImageColorAllocate($litenbild,0,0,0);
ImageCopyResized($litenbild,$a,0,0,0,0,$litenbild_x,$litenbild_y,$storbild_x,$storbild_y);
ImageRectangle($litenbild,0,0,$litenbild_x,$litenbild_y,$black);
ImageJpeg($litenbild,"mapp där jag vill ha den lilla bilden/$storbild");
ImageDestroy($a);
ImageDestroy($litenbild);
}
?>

Denna lägger till en border i svart runt bilden också.. =)

------------------
//Du ska inte slänga vatten över ån.
PHP vs ASP (10 - 0)

Medlem sedan maj 2000156 inlägg
#3

Ungefär samma metod som jag använder.

ImageCopyResized verkar bara "pressa" ihop bilden utan tanke på att göra det snyggt :(

Kvaliten är "ok" men inte mer. Gör du samma förminskning i tex Photoshop blir resultatet enormt mycket bättre. Jag hoppas få det en del bättre genom att använda den där metoden över istället om jag kan lista ut hur man kompilerar om källkoden :)

hjälp!

------------------
Johan
WakeNet AB

Medlem sedan maj 2000156 inlägg
#4

Exempel:

Förminskad bild i photoshop (10k):
http://www.dokusapa.nu/villa_michaela_liten.jpg

Med ImageCopyResized (12k): http://www.dokusapa.nu/bildarkiv/10_liten.jpg

------------------
Johan
WakeNet AB

Medlem sedan jan. 2000224 inlägg
#5

OK IC
Ganska stor skillnad ändå.. Borde ju gå att fixa på något sätt. Lyckas sop Lunarstorm pilla ihop ett skript i ASP ska väl det gå i PHP också.

------------------
//Du ska inte slänga vatten över ån.
PHP vs ASP (10 - 0)

Medlem sedan maj 2000156 inlägg
#6

Jo, det är sant ;)

Har ju halva lösningen ovan. Vet bara inte hur man ska fixa det.

------------------
Johan
WakeNet AB

Medlem sedan feb. 20001 050 inlägg
#7

Johan!: Vad är det för operativsystem det gäller? Vilken server?

r: Skall detta göras varje gång sidan laddas, eller skall det bara göras en gång när bilden laddas upp till server? Eventuellt skulle man kunna göra en ren PHP-lösning :)

/nicclas

[Redigerat av nicclas den 03 apr 2001]

Medlem sedan jan. 20001 006 inlägg
#8

Jag råder dig varmt att installera ImageMagic (www.imagemagic.org). Inte allt för svårt att installera (t.o.m. jag klarade det).

Att tillverka en "thumbnail" handlar då om endast en rad PHP.

<?
exec("/usr/local/bin/convert -geometry 25% -quality 60 originalbild.jpg thumbnail.jpg")
?>

Originalbild
Thumbnail

/j

------------------
R6

[Redigerat av Batboy den 03 apr 2001]

Medlem sedan maj 2000156 inlägg
#9

Linux 6.2
Php 4

Ska bara göras när bilderna laddas upp så inte alltför ofta.

Går det att göra en bicubic interpolation of pixels lösning genom en ren php lösning?

------------------
Johan
WakeNet AB

Medlem sedan maj 2000156 inlägg
#10

Jag råder dig varmt att installera ImageMagic (www.imagemagic.org). Inte allt för svårt att installera (t.o.m. jag klarade det).

Tittade precis lite på det. Tack för tipset med koden man ska använda. Ska testa lite..

------------------
Johan
WakeNet AB

[Redigerat av Johan! den 03 apr 2001]

Medlem sedan jan. 20001 006 inlägg
#11

Jämfört med t.ex. GD tycker jag att ImageMagic är rena himmelriket att använda. I det lilla exemplet ovan använda jag 'convert', allt detta kan göras -> http://www.imagemagick.org/www/convert.html

/j

------------------
R6

Medlem sedan feb. 20001 050 inlägg
#12

Går det att göra en bicubic interpolation of pixels lösning genom en ren php lösning?

Japp, det går bra. Kanske inte blir grymt snabb, men det skall inte vara några problem om det inte är så stora bilder och om det bara handlar om att göra det när bilden laddas upp.

Medlem sedan maj 2000156 inlägg
#13

Japp, det går bra.

Hur? :)

Jämfört med t.ex. GD tycker jag att ImageMagic är rena himmelriket att använda

Verkar lovande. Ska testa det imorgon.

------------------
Johan
WakeNet AB

Medlem sedan feb. 20001 050 inlägg
#14

Hur?
Ja, du har ju givit en kod för hur man gör en "bicubic interpolation of pixels" i C-kod oven. GD innehåller tillräckligt med funktioner för att enkelt översätta denna kod till PHP.

Men jag skulle kanske satsa på ImageMagick, den kan ju så mycket mer så den har du nog gjädje av i fler sammanhang.

/nicclas

256 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)