【发布时间】:2011-08-11 15:10:19
【问题描述】:
我需要一个在提供的图像上制作圆形透明角的脚本。我找到了一个,它工作得很好,除了一件事:应用的角落看起来不光滑。 imageantialias() 自 PHP is running on Debian 以来引发致命错误,并且无法重新编译它。
我发现让这些角落看起来平滑的技巧是使用imagecopyresampled() 调整图像大小,如下所示:
- 准备图像;
- imagecopyresample 到 10 倍大小;
- 用特殊颜色绘制角;
- 使该颜色透明;
- 将图片缩小到原来的大小
但是问题来了:结果图像的角(在第 5 步之后)是smooth, but not transparent。在步骤 4 之后发送以输出图像时(即在减小其大小之前)–everything's as it should be.
下面是负责圆角的代码部分:
// $dest = 图片资源 $q=10; // 让一切都变大 10 倍 $新宽度=$宽度*$q; $新高度=$高度*$q; $半径=$半径*$q; $magnified=imagecreatetruecolor($new_width, $new_height); imagecopyresampled($magnified, $dest, 0,0, 0,0, $new_width,$new_height, ($new_width/$q),($new_height/$q)); // 选择唯一的颜色 $找到=假; 而($找到==假){ $r = 兰德(0, 255); $g = 兰德(0, 255); $b = 兰德(0, 255); if(imagecolorexact($magnified, $r, $g, $b) != (-1)) { $找到=真; } } $colorcode = imagecolorallocate($magnified, $r, $g, $b); // 画角 imagearc($magnified, $radius-1, $radius-1, $radius*2, $radius*2, 180, 270, $colorcode); imagefilltoborder($magnified, 0, 0, $colorcode, $colorcode); imagearc($magnified, $new_width-$radius, $radius-1, $radius*2, $radius*2, 270, 0, $colorcode); imagefilltoborder($magnified, $new_width-1, 0, $colorcode, $colorcode); imagearc($magnified, $radius-1, $new_height-$radius, $radius*2, $radius*2, 90, 180, $colorcode); imagefilltoborder($magnified, 0, $new_height-1, $colorcode, $colorcode); imagearc($magnified, $new_width-$radius, $new_height-$radius, $radius*2, $radius*2, 0, 90, $colorcode); imagefilltoborder($magnified, $new_width-1, $new_height-1, $colorcode, $colorcode); // 使独特的颜色透明 imagecolortransparent($magnified, $colorcode); // 将放大后的图片缩小到原来的大小 // 期望角落保持透明 imagecopyresampled($dest, $magnified, 0,0, 0,0, ($new_width/$q),($new_height/$q), $new_width,$new_height); // 但他们不是 // 发送 $magnified 到输出以进行测试 $dest=$放大; // 将 $dest 输出为 image/png如您所见,当放大的图像被图像复制重新采样到其原始大小时,就会出现问题。透明的角落被$colorcode 颜色填充。我一直在玩imagesavealpha() 和imagealphablending() 作为advised,但没有结果。
请帮助我完成这项工作。
附:这可能很有用:当将 large PNG 上传到 imgur.com 时,它有 converted to JPG 并且您可以看到所有角落都充满了恢复后的 $colorcode。
附:希望我不会因为过度使用“放大”这个词而被禁止:)
【问题讨论】:
-
如果您设置大 W/H,此行会导致致命错误(不要忘记您将原始 W/H 乘以 10)...
$magnified=imagecreatetruecolor($new_width, $new_height);。您可以达到内存限制(或您在 php.ini 中设置的限制)。 -
@Wh1T3h4Ck5 我有一个我可能需要的预定义图像类型数组,其中包含有关宽度、高度和角的信息。在使用图像大小的技巧之前,我一直收到
imageantialias()致命错误,所以我确定这是 Debian 的问题。
标签: php png transparency gd rounded-corners