imagecopyresized
(PHP 3, PHP 4 >= 4.0.0)
imagecopyresized -- 复制图像的一部分并调整其大小
描述
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() 将一张图像的矩形部分复制到另一张图像。 dst_im 是目标图像,src_im 是源图像标识符。如果源坐标和目标坐标以及宽度和高度不同,则会对图像片段进行适当的拉伸或收缩。坐标指的是左上角。此函数可用于复制同一图像内的区域(如果 dst_im 与 src_im 相同),但如果区域重叠,结果将是不可预测的。
另请参见 imagecopyresampled()。
用户贡献的注释
imagecopyresized
plusplus7@hotmail.com
1999 年 9 月 25 日 03:10
在 ng 上看到了这个,它工作正常 - 只是试图找出
jpg。
$new_w=100;
$new_h=100;
header("内容类型:图像/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);
?>
hoiarie@hotmail.com
15-Jul-2000 04:57
如果您想调整大小或复制来自或到数据库的图像,只需使用
临时文件作为缓冲区。例如:将所有图像数据从数据库复制到
临时文件,在另一个临时文件上使用调整大小功能,并将所有
数据从临时文件复制回数据库。
skurrilo@skurrilo.de
2000 年 11 月 28 日 07:36
如果您对调整大小后的图像质量不满意,只需给
ImageMagick 尝试一下。 (http://www.imagemagick.org) 这是
用于转换和查看图像的命令行工具。
jernberg@fairytale.se
2001 年 2 月 15 日 07:02
[编者。注意:如果你使用的是 GD 2.x,你可以使用 imagecopyresampled(),它
做完全相同的事情]
这是我对 imagecopyresized 的补充
它实现了双三次插值像素,因此结果
比普通的 imagecopyresized ...
将其复制到 src/ext/gd/gc.c 并重新编译 lib。
我希望有人可以做到这一点,以便将其包含在“官方”
版本中
将图片缩小为缩略图真是一个很好的功能。
/* {{{ 原型 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 )
复制图像的一部分并调整其大小 */
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、颜色;
浮动 sX,sY;
浮点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) == 失败)
{
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, DIM, -1, "图像",
le_gd);
ZEND_FETCH_RESOURCE(im_src, gdImagePtr, SIM, -1, "图像",
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);
// 咖啡调色板
for( i=0; igdImageColorAllocate( 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) ); = gdImageGetPixel(im_src, (int)(sXscaleX2), (int)(sYscaleY2) );
c4 = gdImageGetPixel(im_src, (int)(sXscaleX2), (int)(sY) );
r = (im_src->red[c1] im_src->red[c2] im_src->red[c3]
im_src->red[c4]) / 4;g = (im_src->绿色[c1] im_src->绿色[c2] im_src->绿色[c3]
im_src->绿色[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), 颜色 );
};
};
RETURN_TRUE;
}
#endif /* HAVE_LIBGD */
aleczapka@gmx.net
13-Mar- 2001 06:33
回复:imagecopyresizedbicubic
是的,这个功能真的很棒!缩略图好多了。
但是上面发布的示例适用于 PHP4,如果您需要 PHP3
(并且您确实应该使用它),则必须执行以下操作:
(注意:我更改了此名称函数到 imagecopyresizedbb -
这样写会更短)
编辑文件functions/gd.c。
找到名为“function_entry gd_functions[]”的函数,并在其中添加
此函数定义:(我建议在原始
imagecopyresized - 第 98 行左右)
{"imagecopyresizedbb", php3_imagecopyresizedbb, NULL},
然后添加此函数(我建议在原始 imagecopyresized
函数下方 - 第 2030 行左右)
/* {{{原型 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);
复制图像的一部分并调整其大小(双三次)*/
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、颜色;
浮动 sX,sY;
浮点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) == 失败) {
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, "无法找到图像指针");
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, "无法找到图像指针");
RETURN_FALSE;
}
for( i=0; igdImageColorAllocate( im_dst, im_src->red[i],
im_src->green[i], im_src -> 蓝色[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)(sXscaleX2),
(int)(sYscaleY2) );
c4 = gdImageGetPixel(im_src, (int)(sXscaleX2), (int)(sY) ) );
r = (im_src->red[c1] im_src->red[c2]
im_src->red[c3] im_src->red[c4]) / 4; g = (im_src->绿色[c1] im_src->绿色[c2]
im_src->绿色[c3] im_src->绿色[c4]) / 4;
b = (im_src->蓝色[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), 颜色 );
};
RETURN_TRUE;
然后在functions/php3_gd.h中添加此行(我建议在原始
imagecopyresized函数下方 - 第74行附近)
extern void php3_imagecopyresizedbb (INTERNAL_FUNCTION_PARAMETERS);
然后重新编译 PHP 就可以了!
稍后在 PHP 脚本中只需使用 imagecopyresizedbb 而不是标准的
imagecopyresized 函数,您的缩略图就会变得平滑且
闪亮。
Colin_Witt@baylor.edu
2001 年 4 月 5 日 06:49
关于让 ImageCopyResizedBicubic 工作的一个说明。仅将
代码块添加到 gd.c 中是不行的。您还必须做另外两件事:
在 gd.c 的前 150 行左右,您会发现一个以
开头的部分,如下所示:
function_entry gd_functions[]
找到以 PHP_FE(imagecopyresized 开头的行,复制此行,然后
将新副本粘贴到原始副本下方。将
“imagecopyresized”更改为“imagecopyresizedbicubic”
新副本
此外,您还需要按如下方式编辑php_gd.h:
找到以下行:
PHP_FUNCTION(imagecopyresized)
(它是)对我来说是第 87 行)
并在其下面添加一行:
PHP_FUNCTION(imagecopyresizedbicubic);
完成这些更改后,重新编译并重新安装 php,并且您
应该很好,使用此功能可以更好地进行缩放。指出上面的帖子适用于 PHP4。以及
上面发布的 3 篇帖子,涉及
“imagecopyresizedbicubic”
如果您想在 PHP3 中使用它,请阅读帖子标题为“回复:
imagecopyresizedbicubic”
darren@php4hosting.com
2001 年 6 月 16 日 01:10
在太多 e 后就可以了。 -mails :)
http://www.alt-php-faq.org/downloads/patch
假设您使用的是 Linux 和 PHP-4.0.5 源
获取 PHP-4.0 .5 来源
wget http://www.alt-php-faq.org/downloads/patch
tar -pxzf php-4.0.5.tar.gz
cd php-4.0.5
patch -p0
然后进行正常的配置/制作/制作安装
检查 GD 下的 PHPinfo 是否启用了 ImageResizeBicubic。
sfm15@columbia.edu
2001 年 7 月 5 日 11:37
我一直在使用 imagecopyresizedbicubic 函数,它在
上效果很好制作更高质量的缩略图。然而,缩略图
对于内存来说似乎非常大。例如,我将图像
从 200x280 像素调整为 140x195 像素,但较小的图片最终
约为 26K,而原始较大图片通常约为 12K。
此外,当我将图像输出为 JPEG 时,我
选择的质量并不重要。不管怎样,它的尺寸/质量
都是相同的。
rze@counter-strike.net
10-Jul-2001 11:47
对于那些无法更新 GD 模块的人,我已经做了这个功能。如果
你认为你可以做出任何好的改变,请随时通过电子邮件发送给我。
坦白说,我不知道第一个示例中的 for 循环是做什么的,我只是
猜测,它似乎工作得很好。
注意:这是一个非常非常慢的函数。切勿将其用于动态
输出,仅保存到缩略图文件等。
函数 ImageCopyResampleBicubic ($dst_img, $src_img, $dst_x, $dst_y,
$src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h)
/*
由 John Jensen 移植到 PHP,2001 年 7 月 10 日 -- 原始代码(C 语言,用于
PHP GD 模块),由 jernberg@fairytale.se
*/
{
for ($ i = 0; $i 正确吗?
$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 $sY = $j * $scaleY;
for ($i = $src_x; $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);
}
}
}
darren@php4hosting.com
11-Jul-2001 10:01
这个功能很好用通过我们的安装,速度和
质量一样好,但是它不适用于 GD 版本 2!
升级时要记住的事情
info@methmedia.de
2001 年 9 月 27 日 01:12
Header("Content-类型:图像/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);
仅当 png 文件的颜色深度为真彩色时才有效。我尝试过
256 种颜色,但图片只是黑色。
2001 年 10 月 28 日 09:10
将此函数与 imagecreatefromstring() 一起使用时,必须使用
ImageCreateTrueColor() 作为目标图像。这将给出一个
完整的调色板。否则,生成的图像会看起来很奇怪。这
也适用于ImageCopyResampled()。
william@waw.com.br
12-Jan-2002 02:55
重新定义?双立方?啊啊!
如果您对调整大小后的图像质量不满意,只需使用此:
// Criathumbnail de uma imagem, com boa qualidade
// - ----------------------------------------------------------
/ / William G. Comnisky
// william@waw.com.br
$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);
?>
rze@counter-strike.net
2002 年 1 月 24 日 11:28
“重新定义?BICUBIC?啊!
如果您对调整大小后的图像质量不满意,只需使用:
*code*"
双三次比重新采样更好。两者都不好看,但双三次
更好看。
无论哪种情况,重新采样仅适用于 GD 2.0。大多数服务器没有 2.0
,我什至不确定 bicubic 是否适用于 2.0。
big_dog001@hotmail.com
03-Apr-2002 09:30
关于双三次函数。我用 apache 1.3.12 手动修补了 openbsd 2.8 上
php 4.1.2 上的所有注释,并在
apache 日志文件中收到错误,例如:
未定义符号“_GDLS_FETCH”称为来自[libphp4.so]...
通过删除建议的双三次函数中的“GDLS_FETCH()”
它开始在 openbsd 上工作,没有任何问题。
不确定这个 GDLS_FETCH 函数是什么,但
openbsd 不支持它......
希望这有帮助,并感谢一个很好的函数。
全文:www.php.net