Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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
将JPEG/PNG转换为PNG用于数据库存储,但在PHP中显示时无法保持背景透明度/颜色_Php_Image - Fatal编程技术网

将JPEG/PNG转换为PNG用于数据库存储,但在PHP中显示时无法保持背景透明度/颜色

将JPEG/PNG转换为PNG用于数据库存储,但在PHP中显示时无法保持背景透明度/颜色,php,image,Php,Image,我有一个脚本,用于将JPEG或PNG转换为PNG用于数据库存储,我将文件编码为base64并存储在数据库中,我从数据库或缓存中提取文件,当在网站上显示时,我只需从数据库或缓存中提取图像数据,并对其进行base64解码,然后使用标准IMG标记显示 我遇到的问题是,无论背景是透明的还是我创建的图像背景颜色,当显示在网页上时,它总是显示为黑色 我试过很多右边的问题,但没有一个答案对我有效 编码函数 解码功能 我也尝试过使用以下两个功能这可能对您有帮助,也可能没有帮助,但是。。。如果可以避免的话,您确实

我有一个脚本,用于将JPEG或PNG转换为PNG用于数据库存储,我将文件编码为base64并存储在数据库中,我从数据库或缓存中提取文件,当在网站上显示时,我只需从数据库或缓存中提取图像数据,并对其进行base64解码,然后使用标准IMG标记显示

我遇到的问题是,无论背景是透明的还是我创建的图像背景颜色,当显示在网页上时,它总是显示为黑色

我试过很多右边的问题,但没有一个答案对我有效

编码函数

解码功能


我也尝试过使用以下两个功能

这可能对您有帮助,也可能没有帮助,但是。。。如果可以避免的话,您确实不想将图像存储到数据库中。你这样做有什么好的理由吗?文件系统擅长存储二进制文件。数据库擅长存储数据。为作业使用适当的工具–将其存储为文件。

这可能对您有帮助,也可能没有帮助,但。。。如果可以避免的话,您确实不想将图像存储到数据库中。你这样做有什么好的理由吗?文件系统擅长存储二进制文件。数据库擅长存储数据。对作业使用适当的工具–将其存储为文件。

要保存透明度,需要添加imagesavealpha,请参见

imagefill将使用定义为$transparent的所需颜色在选定坐标上执行整体填充。请参见:

使用所需的fillColor对图像左上角的相邻颜色进行整体填充

否则,请使用imagecolortransparent添加透明度,请参见


要将黑色替换为透明色。

要保存透明度,需要添加imagesavealpha,请参见

imagefill将使用定义为$transparent的所需颜色在选定坐标上执行整体填充。请参见:

使用所需的fillColor对图像左上角的相邻颜色进行整体填充

否则,请使用imagecolortransparent添加透明度,请参见


将黑色替换为透明。

可能重复@HendraNucleo,谢谢,但答案是C,我的脚本是PHP。我的错误,收回了我的标志:@HendraNucleo可能重复,谢谢,但答案是C,我的脚本是PHP。我的错误,收回我的标志:你是对的,数据库存储不是图像的最佳存储,但我不认为数据库是本例中的问题。我认为imagealphablending或imagepng是问题的根源。就这一点而言,为什么OP会将JPEG转换为PNG,为什么它们会在存储图像之前对图像进行base64编码?我从来没有听说过一个数据库没有二进制数据的列类型。但是,是的,虽然这个答案可能不能解决OP的直接问题,但我确实相信这是一个有价值的,我甚至可以说是对这一页的重要贡献+1我提供。由于网站的动态性质以及处理、安全策略和备份计划的特定要求,图像被存储。图像基本上存储在文件服务器上,因为数据库只查询一次,然后图像缓存在web服务器上,数据库存储有助于备份策略,因此文件服务器上不存在除缓存之外的任何数据,如果需要,可以安全地擦除这些数据,而不会产生连锁影响。感谢您的输入。您是正确的,数据库存储不是图像的最佳存储,但我不认为数据库是本例中的问题。我认为imagealphablending或imagepng是问题的根源。就这一点而言,为什么OP会将JPEG转换为PNG,为什么它们会在存储图像之前对图像进行base64编码?我从来没有听说过一个数据库没有二进制数据的列类型。但是,是的,虽然这个答案可能不能解决OP的直接问题,但我确实相信这是一个有价值的,我甚至可以说是对这一页的重要贡献+1我提供。由于网站的动态性质以及处理、安全策略和备份计划的特定要求,图像被存储。图像基本上存储在文件服务器上,因为数据库只查询一次,然后图像缓存在web服务器上,数据库存储有助于备份策略,因此文件服务器上不存在除缓存之外的任何数据,如果需要,可以安全地擦除这些数据,而不会产生连锁影响。尽管如此,还是要感谢你的意见。
public function encode($image, $resize = false, $dirLevel = '')
{
    $vTempFileName = TEMP_DIR . '_'.rand(1111111, 9999999) . '.png';

    // Convert image to PNG
    $image = imagecreatefromstring(file_get_contents($image));
    imagealphablending($image, true);
    imagepng($image, $vTempFileName);

    $vImageDetails = array(base64_encode(file_get_contents($vTempFileName)), filesize($vTempFileName));

    // Remove temporary file after processing
    @unlink($vTempFileName);

    return $vImageDetails;
}
echo base64_decode($image);
public function encode($image, $resize = false, $dirLevel = '')
{
    $vTempFileName = TEMP_DIR . '_'.rand(1111111, 9999999) . '.png';

    // Convert image to PNG
    $image = imagecreatefromstring(file_get_contents($image));
    imagealphablending($image, true);
    imagesavealpha($image, true);
    imagepng($image, $vTempFileName);

    $vImageDetails = array(base64_encode(file_get_contents($vTempFileName)), filesize($vTempFileName));

    // Remove temporary file after processing
    @unlink($vTempFileName);

    return $vImageDetails;
}
$fillColor = imagecolorallocatealpha($image, 0, 0, 0, 127); 
imagefill($image, 0, 0, $fillColor); 
$replaceBlack = imagecolorallocate($image, 0, 0, 0); 
imagecolortransparent($image, $replaceBlack);