首页 > 后端开发 > php教程 > 制作图片 size (jpg)_PHP

制作图片 size (jpg)_PHP

WBOY
发布: 2016-06-01 12:32:15
原创
1140 人浏览过

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

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板