note 11925 deleted from function.imagecopyresized by aidan
| From: | aidan@php.net | Date: | Mon, 04 Oct 2004 09:41:30 +0000 |
| Subject: | note 11925 deleted from function.imagecopyresized by aidan | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-77935@lists.php.net to get a copy of this message | ||
Note Submitter: aleczapka at gmx dot net
----
re: imagecopyresizedbicubic
Yes, this function is really great! The thumbnails are much, much better.
However the example posted above is for PHP4, and if you need it for PHP3 (and you really should use
it), you have to do the following:
(notice: I changed the name of this function to imagecopyresizedbb - it's just shorter to write
this way)
Edit the file functions/gd.c.
Find the function named "function_entry gd_functions[]" and add this function definition
there: (I suggest below the orginal imagecopyresized - around line 98)
{"imagecopyresizedbb", php3_imagecopyresizedbb, NULL},
Then add this function (I suggest below the orginal imagecopyresized function - around line 2030)
/* {{{ proto int imagecopyresizedbb(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 (bicubic) part of an image */
void php3_imagecopyresizedbb(INTERNAL_FUNCTION_PARAMETERS)
{
pval *SIM, *DIM, *SX, *SY, *SW, *SH, *DX, *DY, *DW, *DH;
gdImagePtr im_dst;
gdImagePtr im_src;
int srcH, srcW, dstH, dstW, srcY, srcX, dstY, dstX;
int ind_type;
int i, j;
int r, g, b, c1,c2,c3,c4,color;
float sX, sY;
float scaleX,scaleY,scaleX2,scaleY2;
GD_TLS_VARS;
if (ARG_COUNT(ht) != 10 ||
getParameters(ht, 10, &DIM, &SIM, &DX, &DY, &SX, &SY, &DW, &DH,
&SW, &SH) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long(SIM);
convert_to_long(DIM);
convert_to_long(SX);
convert_to_long(SY);
convert_to_long(SW);
convert_to_long(SH);
convert_to_long(DX);
convert_to_long(DY);
convert_to_long(DW);
convert_to_long(DH);
srcX = SX->value.lval;
srcY = SY->value.lval;
srcH = SH->value.lval;
srcW = SW->value.lval;
dstX = DX->value.lval;
dstY = DY->value.lval;
dstH = DH->value.lval;
dstW = DW->value.lval;
im_src = php3_list_find(SIM->value.lval, &ind_type);
if (!im_src || ind_type != GD_GLOBAL(le_gd)) {
php3_error(E_WARNING, "Unable to find image pointer");
RETURN_FALSE;
}
im_dst = php3_list_find(DIM->value.lval, &ind_type);
if (!im_dst || ind_type != GD_GLOBAL(le_gd)) {
php3_error(E_WARNING, "Unable to find image pointer");
RETURN_FALSE;
}
for( i=0; i<256; i++ ) {
gdImageColorAllocate( im_dst, im_src->red[i], im_src->green[i], im_src->blue[i] );
};
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;
}
/* }}} */
Then add this line in functions/php3_gd.h (I suggest below the orginal imagecopyresized function -
around line 74)
extern void php3_imagecopyresizedbb(INTERNAL_FUNCTION_PARAMETERS);
Then recompile PHP and that's it!
Later in PHP script just use imagecopyresizedbb instead of standard imagecopyresized function and
your thumbnails will become smooth and shiny.