我想使用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();
答案 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文件,以下两段代码会产生相同的结果:
从PNG文件中读取图像数据:
$sourceData = file_get_contents('input.png');
从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);
只有在执行file_get_contents()
的服务器上启用fopen wrappers时,第二段代码才有效。
在单个脚本中使用第二个代码片段(因为它执行冗余编码和解码)没有多大意义,但是如果编码和恢复(解码)发生在不同的脚本。
它们可以是同一个应用程序的一部分(编码数据的脚本将其存储在数据库中,另一个脚本从数据库加载,恢复图像数据并使用它)或解码可能发生在远程应用程序中通过Internet发送数据URL以供其他应用程序解码和使用。