PHP中的file_get_contents与Javascript中的toDataUrl相同吗?

时间:2018-04-03 10:46:42

标签: javascript php

我想使用API​​来压缩图像。它表示输入也可以是缓冲区(带二进制的字符串),例如:

$sourceData = file_get_contents("unoptimized.jpg");
$resultData = \Tinify\fromBuffer($sourceData)->toBuffer();

根据我的理解,他们使用file_get_contents从文件创建缓冲区。

就我而言,我已经使用React应用程序获得了一个画布图像。为了进行API调用,我创建了一个数据URI,使用.toDataURL()看起来像这样:

data:image/png;base64,iVBORw0KGgoAAAANSUh... // lots of letters

因此,我可以使用此数据URI而不是file_get_contents,因为这两个命令在不同的语言中实际上是相同的,或者是否存在差异?像:

$sourceData = 'data:image/png;base64,iVBORw0KGgoAAAANSUh...'
\Tinify\fromBuffer($sourceData)->toBuffer();

API参考:https://tinypng.com/developers/reference/php

2 个答案:

答案 0 :(得分:1)

file_get_contents以字符串形式返回文件内容,该字符串完全代表文件的内容。

.toDataURL()为您提供了一个数据网址。 data:image/png;base64,部分告知以下数据代表 png ,并且数据是 base64 编码的。

要获得与file_get_content相同的数据表示,您需要解码iVBORw0KGgoAAAANSUh...

所以是的,两者都给你一个文件的内容,但他们不会以同样的方式做到这一点。

另一方面,toBlob将返回一个缓冲区,其中包含与file_get_contents相同的相同表示中的数据。

答案 1 :(得分:1)

假设您有一个名为input.png的PNG文件,以下两段代码会产生相同的结果:

  1. 从PNG文件中读取图像数据:

    $sourceData = file_get_contents('input.png');
    
  2. 从PNG文件生成的data:网址中读取图片数据:

    // Generate the 'data:' URL
    $url = 'data:image/png;base64,'.base64_encode(file_get_contents('input.png'));
    
    // Read the image data from the 'data:' URL
    $sourceData = file_get_contents($url);
    
  3. 只有在执行file_get_contents()的服务器上启用fopen wrappers时,第二段代码才有效。

    在单个脚本中使用第二个代码片段(因为它执行冗余编码和解码)没有多大意义,但是如果编码和恢复(解码)发生在不同的脚本。

    它们可以是同一个应用程序的一部分(编码数据的脚本将其存储在数据库中,另一个脚本从数据库加载,恢复图像数据并使用它)或解码可能发生在远程应用程序中通过Internet发送数据URL以供其他应用程序解码和使用。