[gd/php] constrain proportions bij thumbnail

Pagina: 1
Acties:

  • DPLuS
  • Registratie: April 2000
  • Niet online
Hoi,

Is het mogelijk dat als ik van een plaatje een thumbnail maak in php, dat 'ie dan de juiste verhoudingen behoudt.
Dwz: als ik opgeef dat the thumbnail 120 pixels groot moet zijn, dat 'ie zelf dan berekent hoe wijd het plaatje moet zijn...

  • Willem2
  • Registratie: Oktober 2000
  • Laatst online: 10-09 07:49

Willem2

Ω is futile

ja, ff de properties van de image opvragen mbv php, kun je de rest zo uitrekenen!

en nee, ik houd niet van voetbal... :)


  • chem
  • Registratie: Oktober 2000
  • Laatst online: 27-08 13:53

chem

Reist de wereld rond

huh?
je kan toch zelf uitrekenen wat de verhoudingen zijn en vv. mbv imagecopyresized () de boel thumb-en?

Klaar voor een nieuwe uitdaging.


  • Lurge
  • Registratie: Maart 2000
  • Niet online

Lurge

ActueleWind

Dit is misschien wat je zoekt?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
header("Content-type: image/jpeg");
header ("Cache-Control: public, max-age=300");
header ("Pragma: public");
$filenaam = "thumb/thumb_".$imagefile;
if (!isset($imagefile)){$imagefile = "./plaatje.jpg";}
$src_img = imagecreatefromjpeg($imagefile);
$getal = imagesy($src_img) / 96;
$new_w = imagesx($src_img)/$getal;
$new_h = imagesy($src_img)/$getal;
$dst_img=ImageCreate($new_w,$new_h);
imagecopyresized($dst_img,$src_img,0,0,0,0,$new_w,$new_h,ImageSX($src_img),ImageSY($src_img));
ImageJPeG($dst_img,$filenaam);
?>

Dit scriptje maakt de Y 96 en houd de X dan op de goeie waarde die bij Y=96 hoort.

ActueleWind


  • Lurge
  • Registratie: Maart 2000
  • Niet online

Lurge

ActueleWind

dit moet je dan aanroepen met:
thumbnail.php?imagefile=FILENAAM&fake=.jpg
:)

ActueleWind


Verwijderd

Op maandag 13 augustus 2001 17:16 schreef Lurge het volgende:
dit moet je dan aanroepen met:
thumbnail.php?imagefile=FILENAAM&fake=.jpg
:)
alleen als je 'm als usericon wilt gebruiken.

  • Lurge
  • Registratie: Maart 2000
  • Niet online

Lurge

ActueleWind

Op maandag 13 augustus 2001 18:43 schreef MrK het volgende:

[..]

alleen als je 'm als usericon wilt gebruiken.
Ja oke jij je zin je hebt gelijk :)

ActueleWind


  • _.Luke._
  • Registratie: September 2001
  • Laatst online: 26-07-2021
Op maandag 13 augustus 2001 17:11 schreef Lurge het volgende:
Dit is misschien wat je zoekt?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
header("Content-type: image/jpeg");
header ("Cache-Control: public, max-age=300");
header ("Pragma: public");
$filenaam = "thumb/thumb_".$imagefile;
if (!isset($imagefile)){$imagefile = "./plaatje.jpg";}
$src_img = imagecreatefromjpeg($imagefile);
$getal = imagesy($src_img) / 96;
$new_w = imagesx($src_img)/$getal;
$new_h = imagesy($src_img)/$getal;
$dst_img=ImageCreate($new_w,$new_h);
imagecopyresized($dst_img,$src_img,0,0,0,0,$new_w,$new_h,ImageSX($src_img),ImageSY($src_img));
ImageJPeG($dst_img,$filenaam);
?>

Dit scriptje maakt de Y 96 en houd de X dan op de goeie waarde die bij Y=96 hoort.
Onwijs bedankt!!! dis precies wat ik nodig heb... echt kewl..
ik weet wel dat dit niet mijn post was maar ik heb gezocht en gevonden :):) senks alot!!!

Luc

Trying is the first step towards faillure...


  • _.Luke._
  • Registratie: September 2001
  • Laatst online: 26-07-2021
Nu ga ik nog even een vraaggie stellen...

hoe kan het dat de kwaliteit van de JPG wat slecht wordt... kan ik daar op een of andere manier wat aan doen?...
Compressie instellen ofzo?

Alvast bedankt!

Luc

Trying is the first step towards faillure...


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Op donderdag 04 oktober 2001 12:57 schreef _.Luke._ het volgende:
Compressie instellen ofzo?
Dat...
Op donderdag 04 oktober 2001 12:57 schreef _.Luke._ het volgende:
Alvast bedankt!

Luc
Mag ik jou ook nog wijzen op:
Wij tweakers doen elkaar permanent de groeten. Het is dus niet nodig om steeds ruimteverspillende "greetz [user]" of iets dergelijks onder je post te plakken. Als je perse zoiets wilt kun je daar je signature voor gebruiken (zie latere uitleg).

  • _.Luke._
  • Registratie: September 2001
  • Laatst online: 26-07-2021
Op donderdag 04 oktober 2001 13:02 schreef ACM het volgende:

[..]

Dat...
[..]

Mag ik jou ook nog wijzen op:
[..]
Goed... geen groeten meer...
maar euh... waar staat dat "Dat..." voor?

Trying is the first step towards faillure...


  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 03-09 17:11

GraasGast

Analogue Heaven

Tip: Gebruik php 4.0.6 met gd-lib 2.0 of hoger, dan kan je ipv imagecopyresized(); gaan werken met imagecopyresampled(); en dat maakt je thumbnails een stuk mooier!

  • Lurge
  • Registratie: Maart 2000
  • Niet online

Lurge

ActueleWind

er staat ook op php.net (in de usercomments) een funcite die je in je PHP source kan plaatsen en die heet imageresizedbicubic dan maak je ook wat mooiere thumbnails. tenminste ik vind de kwaliteit prima.
vb:
http://fotos.zwartevogel.nl/17sept/thumb/thumb_DSCF0002.JPG
is een verkleining van deze foto:
http://fotos.zwartevogel.nl/17sept/medium/medium_DSCF0002.JPG
Dit is dat stukje van 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 */

ActueleWind


  • Lurge
  • Registratie: Maart 2000
  • Niet online

Lurge

ActueleWind

wat ik mij bedacht is dat je als je dat meot doen je toch al je php moet recompilen dus kan je net zo goed doen wat graasgast zegt.

ActueleWind


  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 03-09 17:11

GraasGast

Analogue Heaven

precies :)

die bicubic en truecolor dingen in gd2 zijn echt super...maakt echt vrijwel alles mogelijk...

  • _.Luke._
  • Registratie: September 2001
  • Laatst online: 26-07-2021
Ik vind die kwaliteit dus echt heel goed super...
maar euh... heeft iemand toevallig die kant en klare dll (jaja ik gebruik gewoon windows...) voor mij beschikbaar of heeft iemand toevallig een idee hoe ik dat moet gaan compilen... ik heb geen source gedowned btw...
let wel dat ik alles behalve een bruute c programmeur ben...

Trying is the first step towards faillure...


  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 03-09 17:11

GraasGast

Analogue Heaven

open php.ini in je windows mappie, en scroll naar de lijst met extensies. dan haal je de ; weg voor de regel met mod_gd.dll ofzo, ff saven, je webserver restarten en ready :)

  • _.Luke._
  • Registratie: September 2001
  • Laatst online: 26-07-2021
die module is wel geladen that's for sure...

Het is alleen zo dat die imagecopyresizedbicubic() functie moet worden gecompileerd en er moet een .dll van gemaakt worden... gd.dll (toch?)
enne die kant en klare dll heb ik volgens mij nodig...

Trying is the first step towards faillure...


  • _.Luke._
  • Registratie: September 2001
  • Laatst online: 26-07-2021
Goed dan....

Dit stukkie zou GOED moeten werken dacht ik...
dat bicubic verhaal schijnt niet nodig te zijn wanneer je imagecopyresampled() gebruikt... nou... ik krijg nog steeds bagger kwaliteit thumbs.... is er iets fout aan mijn script... ?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?
header("Content-type: image/jpeg");
header ("Cache-Control: public, max-age=300");
header ("Pragma: public");
$filenaam = "thumb/thumb_".$imagefile;
if (!isset($imagefile))
{
    $imagefile = "jow.jpg";
}

$src_img = imagecreatefromjpeg($imagefile);
$getal = imagesy($src_img) / 100;
$new_w = imagesx($src_img)/$getal;
$new_h = imagesy($src_img)/$getal;
$dst_img=ImageCreate($new_w,$new_h);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$new_w,$new_h,ImageSX($src_img),ImageSY($src_img));

Imagejpeg($dst_img,$filenaam);
//Aanroepen met: http://localhost/GD/test.php?imagefile=FILENAAM.jpg
?>

Trying is the first step towards faillure...

Pagina: 1