Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/GD ImageSaveAlpha和ImageAlpha混合_Php_Image_Png_Transparency_Gd - Fatal编程技术网

PHP/GD ImageSaveAlpha和ImageAlpha混合

PHP/GD ImageSaveAlpha和ImageAlpha混合,php,image,png,transparency,gd,Php,Image,Png,Transparency,Gd,我使用GD来调整和转换图像的大小,但是在我的测试中,我发现将透明PNG转换为JPEG时有一个奇怪的行为。根据手册,默认情况下()处于启用状态,但为了保持透明度,我必须将()设置为true(这反过来要求我将ImageAlphaBlending()设置为false)。因此,正确的方法应该是: $result = ImageCreateFromPNG(...); ImageAlphaBlending($result, false); ImageSaveAlpha($result, true); Ima

我使用GD来调整和转换图像的大小,但是在我的测试中,我发现将透明PNG转换为JPEG时有一个奇怪的行为。根据手册,默认情况下()处于启用状态,但为了保持透明度,我必须将()设置为true(这反过来要求我将ImageAlphaBlending()设置为false)。因此,正确的方法应该是:

$result = ImageCreateFromPNG(...);
ImageAlphaBlending($result, false);
ImageSaveAlpha($result, true);
ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT);
ImageJPEG($result);
ImageDestroy($result);
然而,如果我用“正确”的方法,所有的透明区域在JPEG中都会变成黑色。这似乎在我的测试中起作用(透明区域上有白色背景的JPEG):

$result = ImageCreateFromPNG(...);
ImageAlphaBlending($result, true); // true by default, but still...
ImageSaveAlpha($result, true);
ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT);
ImageJPEG($result);
ImageDestroy($result);

有人能告诉我这个问题吗?

这可能取决于你的PNG。PNG文件可以包含背景色,当透明度不起作用时可以使用背景色。您的PNG可能有白色背景。当您将ImageAPLabblending设置为true时,它将从PNG中拾取背景色,并在编写JPEG时使用该背景色。当您将其设置为false时,它将为GD选择默认值,即黑色

你可以自己试试。创建一个透明的PNG,并将其保存为橙色或粉色背景色。您的第二个示例应该显示该颜色


顺便说一下,PNG背景色技巧对于IE6图像来说是一个不错的技巧。IE6不支持透明PNG,因此它将以您保存PNG时使用的任何背景颜色显示PNG。保存透明PNG时,请使用与网站相同的背景色保存它们。在IE6中,它比PNG图像周围的白色或黑色框看起来更好。

如果您正在从PNG(或GIF)转换为JPG,您可能应该使用(
$image
是任何已经使用GD创建的图像)将最终图像复制到另一个填充有白色的图像:


希望能有所帮助。

对不起!JPEG格式的Afaik图像不能有“透明”背景或alpha通道。是的,我知道。我只想把原始PNG图像的所有透明区域在JPEG输出上转换成白色。对不起,如果我解释得不够好的话。评论图片($bg,TRUE);这条线给了我完全相同的结果,尽管这和我使用IMG_COLOR_TRANSPARENT常量所做的差不多。我在这里的主要疑问是同时使用ImageAlphaBlending和ImageSaveAlpha,两者都设置为true。这是我得到正确结果的唯一方法,但手册上说这是错误的,并且两者不能同时为真。不确定你的代码在做什么,但上面的代码对我有效。
// Create a new background
$bg = imagecreatetruecolor(imagesx($image), imagesy($image));

// Allocate the color
$color = imagecolorallocate($bg, 255, 255, 255);

// Fill the background with white
imagefill($bg, 0, 0, $color);

// Alpha blending must be enabled on the background!
imagealphablending($bg, TRUE);

// Copy the current image onto the opaque background
if (imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image)))
{
    // Replace the image with the background copy
    imagedestroy($image);
    $image = $bg;
}