当前位置:首页> PHP教程> PHP精通
关键字
文章内容
制作图片 size (jpg)
 
 
修改时间:[2010/12/20 23:39]    阅读次数:[883]    发表者:[起缘]
 
imagecopyresized
(PHP 3, PHP 4 >= 4.0.0)

imagecopyresized -- Copy and resize part of an image
Description
int imagecopyresized ( resource dst_im, resource src_im, int dstX, int dstY, int srcX, int srcY, int dstW, int dstH, int srcW, int srcH)


imagecopyresized() copies a rectangular portion of one image to another image. Dst_im is the destination image, src_im is the source image identifier. If the source and destination coordinates and width and heights differ, appropriate stretching or shrinking of the image fragment will be performed. The coordinates refer to the upper left corner. This function can be used to copy regions within the same image (if dst_im is the same as src_im) but if the regions overlap the results will be unpredictable.

See also imagecopyresampled().

User Contributed Notes
imagecopyresized
[email protected]
25-Sep-1999 03:10

saw this one on the ng and it works fine - just trying to figure it out for
jpg.

$new_w=100;
$new_h=100;

header("Content-type: image/gif");

$dst_img=ImageCreate($new_w,$new_h);

$src_img=ImageCreateFromGif("./imgtest.gif");

ImageCopyResized($dst_img,$src_img,0,0,0,0,$new_w,$new_h,ImageSX($src_img),ImageSY($src_img));

ImageGif($dst_img);

?>



[email protected]
15-Jul-2000 04:57

If you want to resize or copy an image from or to a datbase, just use a
temp-file as buffer. E.g.: copy all the image-data from the database to a
tempfile, use the resize-function on another tempfile and copy all the
data from to tempfile back into the database.



[email protected]
28-Nov-2000 07:36

If you aren't happy with the quality of the resized images, just give
ImageMagick a try. (http://www.imagemagick.org) This is
a commandline tool for converting and viewing images.



[email protected]
15-Feb-2001 07:02

[Ed. note: if you're using GD 2.x, you can use imagecopyresampled() which
does exactly the same thing]

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 for( i=0; 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 */



[email protected]
13-Mar-2001 06:33

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
for( i=0; 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.



[email protected]
05-Apr-2001 06:49

One note on getting the ImageCopyResizedBicubic to work. Just adding the
code block to gd.c won't do it. You have to do two other things as well:

In the first 150 or so lines of gd.c, you will find a section that starts
like this:

function_entry gd_functions[]

Find the line that starts PHP_FE(imagecopyresized , copy this line, and
paste a new copy below the original. Change the
"imagecopyresized" to "imagecopyresizedbicubic" in the
new copy.

Also, you will need to edit php_gd.h as follows:

Find the line that says:
PHP_FUNCTION(imagecopyresized);
(it was line 87 for me)
and add a line below it that says:
PHP_FUNCTION(imagecopyresizedbicubic);

Once you've made these changes, recompile and reinstall php, and you
should be good to go. Scaling works much better with this function.



[email protected]
05-Apr-2001 09:35

Just wanted to point out that the post above applies to PHP4. As well as
the one posted, 3 posts above, concerning
"imagecopyresizedbicubic".

If you would like to use it with PHP3, read the post titled "re:
imagecopyresizedbicubic".



[email protected]
16-Jun-2001 01:10

OK after too many e-mails :)
http://www.alt-php-faq.org/downloads/patch

Assuming you are using Linux and PHP-4.0.5 Source
Get the PHP-4.0.5 Source
wget http://www.alt-php-faq.org/downloads/patch
tar -pxzf php-4.0.5.tar.gz
cd php-4.0.5
patch -p0 < ../patch

Then do your normal configure/make/make install

Check PHPinfo under GD for ImageResizeBicubic enabled.



[email protected]
05-Jul-2001 11:37

I've been using the imagecopyresizedbicubic function and it works great at
making higher quality thumbnails. However, it seems that the thumbnails
are very large with respect to memory. For instance, I'm resizing images
from 200x280 pixels to 140x195 pixels but the smaller pictures wind up
being about 26K while the original larger pictures are usually around 12K.
Also, when I output the image as a JPEG, it makes no difference what I
select as the quality. It comes out being the same size/quality
regardless.



[email protected]
10-Jul-2001 11:47

For those who can't update their GD modules, I've made this function. If
you think you can make any good changes, feel free to e-mail them to me.

Frankly I have no idea what the for loop in the first example does, I just
guessed and it seems to work fine.

Note: it's a VERY, VERY, VERY slow function. Never use it for dynamic
output, only saving to a thumbnail file or the like.


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 protected]
*/
{
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);
}
}
}



[email protected]
11-Jul-2001 10:01

This function works great with our installs and is just as fast as well as
good quality but, it does not work with GD version 2!

Something to remember when upgrading



[email protected]
27-Sep-2001 01:12

Header("Content-type: image/png");
$width=implode($argv,"");
$im1=imagecreatefrompng("timber.png");
$im=imagecreate($width, 12);
imagecopyresized ($im, $im1, 0, 0, 0, 0, $width, 12, ImageSX($im1),
ImageSY($im1));
ImagePng($im);
ImageDestroy($im);

works only if the colordepth of the png-file is true color. i have tried
it with 256 colors and the picture was just black.



28-Oct-2001 09:10

When using this function along with imagecreatefromstring() you must use
ImageCreateTrueColor() for the destination image. This will give a
complete palette. Otherwise, the resulting image will look strange. This
also applies to ImageCopyResampled().



[email protected]
12-Jan-2002 02:55

REDEFINE? BICUBIC? ARGH!

If you aren't happy with the quality of the resized images, just use this:

// Cria thumbnail de uma imagem, com boa qualidade
// -----------------------------------------------
// William G. Comnisky
// [email protected]

$imagem = "img.jpg";

$img_origem = imagecreatefromjpeg($imagem);

$nova_largura = imagesx($img_origem) / 4;
$nova_altura = imagesy($img_origem) / 4;

$img_destino = imagecreatetruecolor($nova_largura,$nova_altura);
imagecopyresampled($img_destino,
$img_origem,0,0,0,0,$nova_largura,$nova_altura,imagesx
($img_origem),imagesy($img_origem));
imageJPEG($img_destino);
?>



[email protected]
24-Jan-2002 11:28

"REDEFINE? BICUBIC? ARGH!

If you aren't happy with the quality of the resized images, just use this:

*code*"

Bicubic is better than resampled. Both are not great looking, but bicubic
IS better looking.

In either case, resampled is only on GD 2.0. Most servers don't have 2.0
and I'm not even sure if bicubic works with 2.0.



[email protected]
03-Apr-2002 09:30

Regarding the bicubic function. I hand patched with all the notes above on
php 4.1.2 on openbsd 2.8 with apache 1.3.12 and was getting errors in the
apache log file like:

Undefined symbol "_GDLS_FETCH" called from [the libphp4.so]...

By removing the "GDLS_FETCH()" in the suggested bicubic function
it started working on openbsd with no problems.

Not sure what this GDLS_FETCH function is but it wasn't supported on
openbsd....

Hope this helps and thanks for a nice function.

全文:www.php.net