当前位置: 首页 > 知识库问答 >
问题:

将Base64映像字符串传递给调用Cloud Vision API的Firebase可调用云函数

韦宏扬
2023-03-14

我正在实现一个Web应用程序,该应用程序使用Cloud Vision API来检测用户生成的图像上的文本。

我正在使用React和Firebase云函数。

流程如下:

  • 用户从画廊或相机获取图像,使用react image croppackage

客户代码

const canvasBase64 = canvas.toDataURL("image/jpeg", 1.0);

const result = await firebase.functions().httpsCallable("readTextFromImage")({
  image: canvasBase64
});

setTextareaValue(result.data.text);

云函数代码

const Vision = require('@google-cloud/vision');
const vision = new Vision.ImageAnnotatorClient();

async function readTextFromImage(data)  {

  const imgBase64 = data.image;
  const [textDetections] = await vision.textDetection(imgBase64);

  // OTHER THINGS I'VE TRIED HERE
  
  const buffer = new Buffer(imgBase64, 'base64');
  const arraybuffer  = Uint8Array.from(buffer).buffer;
  const [textDetections] = await vision.textDetection(buffer);
  const [textDetections] = await vision.textDetection(arraybuffer);
}

注:

base 64映像似乎是正确生成的。

来自节点上的谷歌文档。js Vision API:

https://googleapis.dev/nodejs/vision/latest/v1.ImageAnnotatorClient.html#textDetection

我们得到:

在尝试使用缓冲区时,我得到了no image present并传递了base64字符串,我得到了code:enametolong

问题

我应该如何将base 64字符串转换为Cloud Vision API将接受的内容?

共有1个答案

卢志行
2023-03-14

我就是这样解决的。

我打开了一个Github问题,在那里我得到了更多的细节。

https://github.com/googleapis/nodejs-vision/issues/808

客户代码

我必须删除base 64字符串的第一部分。

这部分:"data: Image/jpeg; base 64,"

const result = await firebase.functions().httpsCallable("readTextFromImage")({
  image: canvasBase64.split("base64,")[1]  // <--- REMOVES THE FIRST PART OF THE STRING
});

云函数代码*

此外,我还必须使用{image:{content:base64String}}

const [textDetections] = await vision.textDetection(
  {
    image: {
      content: imgBase64
    }
  }
);

尽管这与以下文件不符:

https://googleapis.dev/nodejs/vision/latest/v1.ImageAnnotatorClient.html#textDetection

但是我从另一篇文章中得到了这个想法:

https://cloud.google.com/vision/docs/base64

 类似资料:
  • 问题内容: 我想为几个工作人员在Python中实现该模式,并遇到了以下有用的代码段: 资料来源:这里 据我了解,为了这样做,我需要将回调传递给将要调用的函数。如果调用函数是一个方法,大概我可以使用,但是如果没有此方法,我如何才能直接获得对位有用的回调? 问题答案: 任何定义的函数都可以通过简单地使用其名称来传递,而无需在调用末尾添加: 其他示例用法:

  • 我试图将字符串参数传递给JavaScript函数。出于某种原因,它只能获取整数。我在这里只放了字符串的语法,因为我知道这是个问题,因为它与int一起工作。 发送函数内的代码: 最终,我希望用计数器的值调用HTML页面上的以下函数,如上图所示: 正如我提到的,当我发送int时,javascript文件会发出警报,但当我发送字符串时不会做出反应。

  • http://www.codeguru.com/cpp/w-p/win32/tutorials/article.php/c10849/Setting-a-System-Environment-Variable.htm 发送消息(HWND\u广播,WM\u设置更改,0,(LPARAM)“环境”); JNA和windows xp:调用以通知环境已更改 见链接:twall.github.com/jna/

  • 问题内容: 我试图将回调函数从控制器传递给指令。 这是回调函数代码: 指令用法: 指令代码: 模板中的回调用法: 但是,这给了我以下错误: 我看过很多类似的问题,但不明白我在哪里错了。 问题答案: 从指令中调用表达式方法时,您需要以格式传递指令中的参数,还应更正指令属性值以像 指令用法: 指令模板

  • 问题内容: 我正在尝试通过使用JSON格式的字符串初始化Javascript变量来加载数据表。如果我声明: 那么我的表将正确加载该行。 我尝试在脚本之前初始化Java字符串,然后将该对象传递给Javascript变量,如下所示: 我的表无法识别这一点,并且在尝试以这种方式传递行时无法加载该行。如何正确地将Java字符串传递给Javascript,以便我的表能够加载数据? 问题答案: 尝试使用引号。

  • 问题内容: 我正在尝试将一些参数传递给用作回调的函数,该怎么做? 问题答案: 如果您想要更一般的东西,可以使用arguments变量,如下所示: 但是否则,您的示例可以正常工作(可以在测试器中使用arguments [0]代替回调)