---
title: "Lägga till funktion"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/15471-lägga-till-funktion"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "Johan!"
published: "2001-04-03T11:28:00.000Z"
updated: "2001-04-03T21:02:00.000Z"
replies: 13
views: 307
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/15471-lägga-till-funktion"
---

# Lägga till funktion

## #1 — Johan!, 2001-04-03T11:28Z

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 &#0124;&#0124; 
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! :)

Permalänk: https://www.webforum.nu/p/15471

## #2 — U2K, 2001-04-03T13:37Z

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å.. =)

Permalänk: https://www.webforum.nu/p/318006

## #3 — Johan!, 2001-04-03T14:15Z

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!

Permalänk: https://www.webforum.nu/p/318007

## #4 — Johan!, 2001-04-03T14:18Z

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>

Permalänk: https://www.webforum.nu/p/318008

## #5 — U2K, 2001-04-03T18:50Z

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å.

Permalänk: https://www.webforum.nu/p/318009

## #6 — Johan!, 2001-04-03T20:26Z

Jo, det är sant ;)

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

Permalänk: https://www.webforum.nu/p/318010

## #7 — nicclas, 2001-04-03T20:28Z

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\]

Permalänk: https://www.webforum.nu/p/318011

## #8 — Batboy, 2001-04-03T20:40Z

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](http://www.batboy.net/youck/DCP_0023.JPG)
[Thumbnail](http://www.batboy.net/youck/DCP_0023_MINI.JPG)

/j

Permalänk: https://www.webforum.nu/p/318012

## #9 — Johan!, 2001-04-03T20:40Z

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?

Permalänk: https://www.webforum.nu/p/318013

## #10 — Johan!, 2001-04-03T20:42Z

> 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..

Permalänk: https://www.webforum.nu/p/318014

## #11 — Batboy, 2001-04-03T20:48Z

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

Permalänk: https://www.webforum.nu/p/318015

## #12 — nicclas, 2001-04-03T20:53Z

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.

Permalänk: https://www.webforum.nu/p/318016

## #13 — Johan!, 2001-04-03T20:56Z

> 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.

Permalänk: https://www.webforum.nu/p/318017

## #14 — nicclas, 2001-04-03T21:02Z

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

Permalänk: https://www.webforum.nu/p/318018

---

Tråden på webben: https://www.webforum.nu/amne/php/15471-lägga-till-funktion
