从给定的字符串数据中将透明像素变为白色:image/png;base64

Posted

技术标签:

【中文标题】从给定的字符串数据中将透明像素变为白色:image/png;base64【英文标题】:Making transparent pixels white from given String data:image/png;base64 【发布时间】:2012-10-25 14:50:04 【问题描述】:

我知道这可以用纯 php 完成,但找不到解决方案。

这是我目前所拥有的:

<?php 

// posted canvas image data (string), such as: 
// "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArcAAAHbCAYAAADRQ7"
$data = $_POST['data'];

// remove the "data:image/png;base64," part
$uri =  substr($data,strpos($data,",")+1);

$imgData = base64_decode($uri);

// NOT WORKING: transparent to white pixels
$im = imagecreatefromstring($imgData);
$white = imagecolorallocate($im, 255, 255, 255);
imagefill($im, 0, 0, $white);
// END NOT WORKING

// put the data to a file
file_put_contents('yourimage.png', $imgData);

// force user to download the image
if(file_exists('yourimage.png'))
    // save dialog box
    header('Content-Disposition: attachment; filename="yourimage.png"');
    // output png format
    header('Content-type: image/png');
    // read from server and write to buffer
    readfile('yourimage.png');



?>

首先我试图找出PHP是否可以直接更改image/png-String并修改透明部分,但找不到任何东西。现在我尝试从发布的字符串创建图像,但也失败了......

任何帮助表示赞赏。

【问题讨论】:

这对您有帮助吗? ***.com/questions/6109832/… 【参考方案1】:

首先你写错了文件:

file_put_contents('yourimage.png', $imgData);

只是简单地写出从客户端发送的原始解码图像。您正在使用 GD 来操作该图像,这意味着您必须让 GD 写出修改后的图像,例如

imagepng($im, 'yourimage.png');

但是,由于您似乎只是将该图像转储给用户,因此您可以消除更多代码和中间的“yourimage.png”文件:

header('Content-type: image/png');
imagepng($im); // no filename specified, write data out to PHP's output buffer directly.

【讨论】:

感谢您指出我写出 $imgData 而不是 $im 的错误。当我使用建议的 imagepng($im) 时,所有透明像素都会变黑。我想我可以找出原因,***.com/questions/12521136/… gd 不会为你做/保留透明度,除非你告诉它。

以上是关于从给定的字符串数据中将透明像素变为白色:image/png;base64的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PIL 使所有白色像素透明?

我想使用终端中的转换命令从彩色像素之外删除白色背景和图像

使用 imagecopymerge 添加时具有透明背景的图像变为白色

PHP .png 线稿比较

如何使用 php 或 JavaScript 从 svg 中删除白色填充

在 OpenCV python 中将白色像素转换为黑色