43

嘿,当我从它创建缩略图时,尝试在 png 上保持透明度时遇到了一些麻烦,有人有这方面的经验吗?任何帮助都会很棒,这就是我目前正在做的事情:

$fileName= "../js/ajaxupload/tees/".$fileName;

list($width, $height) = getimagesize($fileName);

$newwidth = 257;
$newheight = 197;

$thumb = imagecreatetruecolor($newwidth, $newheight);
imagealphablending($thumb, true);
$source = imagecreatefrompng($fileName);
imagealphablending($source, true);

imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

imagesavealpha($thumb, true);
imagepng($thumb,$newFilename);
4

5 回答 5

85

我过去曾成功地这样做过:

$thumb = imagecreatetruecolor($newwidth, $newheight);
imagealphablending($thumb, false);
imagesavealpha($thumb, true);  

$source = imagecreatefrompng($fileName);
imagealphablending($source, true);

imagecopyresampled($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

imagepng($thumb,$newFilename);

我发现输出图像质量比使用imagecopyresampled()好得多imagecopyresized()

于 2008-11-23T23:23:17.693 回答
14

忘记颜色透明度指数,它永远不会在所有渲染产品中起作用。而是使用 alpha 图层蒙版:

$image = imagecreatetruecolor($size, $size);

imagealphablending($image, false);
imagesavealpha($image, true);

$trans_layer_overlay = imagecolorallocatealpha($image, 220, 220, 220, 127);
imagefill($image, 0, 0, $trans_layer_overlay);
于 2011-02-22T20:59:10.590 回答
3

这些函数访问底层的 gdlib 库,这是一个很好的玩具,但不能产生好的结果。如果您可以选择,请改用imagemagick。缺点是目前没有好的 php-bindings,因此您需要通过 shell 访问它,而共享主机上通常不允许这样做。

于 2008-11-23T23:32:41.263 回答
1

请参阅dycey 对“我如何调整大小...”的回答。本质上,在进行任何其他操作之前,您需要用透明度填充整个背景。

于 2008-11-23T23:06:38.837 回答
1

imagecopyresized不正确支持透明度。

imagecopymerge可以,但不会调整大小。

解决方案?您可能最终会手动调整大小。

于 2008-11-23T23:12:26.657 回答