【发布时间】:2010-11-30 20:09:00
【问题描述】:
我正在尝试做的事情很简单,在我看来应该非常简单。结果并不令人鼓舞。我正在尝试做的事情:我有一个接收 base64 编码的 PNG 图像数据的网页。我可以并且已经通过适当的步骤成功地获取了这些数据,以在文件系统上创建图像。将此称为“脚本 A”:
$imageData = $_POST['png'];
$imageStr = base64_decode($imageData);
$image = imagecreatefromstring($imageStr);
imagepng($image, $somePath);
这很好用。但是我现在有一个新要求,就是稍后读取这个图像,对其进行 base64 编码,然后将其发布到脚本 A,然后脚本 A 将其写回文件系统,就像上面一样。调用第二个脚本,即读取数据并将其发送回脚本 A 的脚本“脚本 B”。当脚本 A 尝试对从脚本 B 收到的数据调用 imagepng 时,我收到了错误:
imagepng(): supplied argument is not a valid Image resource
还和我在一起吗?感人的。所以这对我来说意味着脚本 B 从文件系统读取 .png 数据、对其进行编码并将其发布到脚本 A 的方式存在问题。它的执行方式如下(此处没有错误处理)为了简洁起见,但没有发生错误)--
// Read in image file, base64-encode
$fd = fopen($somePath, 'rb');
$size = filesize($somePath);
$data = fread($fd, $size);
fclose($fd);
$encoded = base64_encode($data);
然后它使用 cURL 将“$encoded”作为参数发布到脚本 A。
现在,我在网上找到了无数这种方法的例子。我很确定它应该可以工作。它没有。我也尝试过使用 file_get_contents。还尝试使用 'imagecreatefrompng' 读取图像,然后使用输出缓冲区控制将图像捕获为流和 base64 编码......没有运气。最后我觉得上面的方法是最简单最常用的。
如果这篇文章太长和/或太难理解,我们深表歉意。很多活动部件就是全部。任何反馈将不胜感激。
干杯
更新:根据 Jon Skeet 的极好的建议,在我使用 MD5 逐步执行代码时检查图像字符串,我已经缩小了问题的范围 - 一旦我将图像写入脚本 B 中的文件系统,然后将其读回,它已经改变了。所以:
$imageStr = base64_decode($imageData);
$image = imagecreatefromstring($imageStr);
imagepng($image, $somePath);
...似乎在操纵数据,因为当我用普通的 fread() 读回它时,MD5 签名已经改变。我认为这是 imagepng 功能,也许它添加了元数据? php 文档对此并不清楚。如果是这种情况,我认为与其在 w/fread() 中读回图像,不如在编写图像时执行与我正在执行的操作相反的操作,例如:
$image = imagecreatefrompng($somePath);
...然后想办法直接获取图像的内容。不过我不知道该怎么做:它似乎需要一个像“imagepng($image)”这样的函数,w/oa 路径,来输出图像的内容......这就是我不想做的.
在这一点上,我认为问题是:
- 如何撤消(或反转)imagepng 似乎在做的事情,或者
- 如何直接输出图片资源的内容
【问题讨论】:
-
IMO,您可能想给一些帮助过您的人投票。
-
啊...同意。学习我的方法,谢谢指点。