Firebase 使用ImageMagick和Google Cloud功能向图像添加文本

Firebase 使用ImageMagick和Google Cloud功能向图像添加文本,firebase,imagemagick,google-cloud-functions,Firebase,Imagemagick,Google Cloud Functions,有没有人能够在谷歌云功能中使用ImageMagick向图像添加文本?我试着使用注解、标签、画图,但没有成功。我在Google Cloud Functions web平台上做所有事情,因此不需要移动集成或任何东西。TL;DR:将TTF文件放在与正在执行的函数相同的目录中(我的是/user\u code),并在运行graphics magick时直接引用该字体 好吧,我似乎找到了一些解决办法。我的情况与你的情况不完全相同,但我看到的是与你完全相同的行为。我使用的是NPM GraphicsMagic

有没有人能够在谷歌云功能中使用ImageMagick向图像添加文本?我试着使用注解、标签、画图,但没有成功。我在Google Cloud Functions web平台上做所有事情,因此不需要移动集成或任何东西。

TL;DR:将TTF文件放在与正在执行的函数相同的目录中(我的是
/user\u code
),并在运行graphics magick时直接引用该字体


好吧,我似乎找到了一些解决办法。我的情况与你的情况不完全相同,但我看到的是与你完全相同的行为。我使用的是NPM GraphicsMagick包装库GM(),而不是生成一个进程。这应该非常相似。我也通过firebase函数执行我的函数,firebase函数只是运行GoogleCloud函数,但我没有访问配置的权限,因此我无法验证它只是使用默认值。我假设它使用默认的Google云函数图像。在任何情况下,显然此图像上安装了ImageMagick的某些子集,并且正常的文本函数成功,但不会以任何方式修改图像输出

最终的解决方案是上传一个字体文件和我的代码以供使用。您期望可用的系统字体(如
arial
)无法使用。我成功地使用了,并使用以下代码成功地在Google云函数上绘制文本:

var gm = require('gm').subClass({ imageMagick: true });
require('gm-base64');

/* ...handler code... */ 

      gm(525, 110, '#ffffffdd')
        .fill('#000000dd')
        .drawCircle(100, 100, 120, 5)
        .font('font.ttf', 20)
        .fill('#00ff00dd')
        .drawText(100, 100, 'graphics')
        .toBase64('png', function(err, base64) {
          if (err != null) {
            throw err;
          }
          console.info(`got base64 encoding: ${base64}`);
          var img = new Buffer(base64, 'base64');

          res.writeHead(200, {
            'Content-Type': 'image/png',
            'Content-Length': img.length,
          });
          res.end(img);
        });

这产生了以下输出:


我不知道它起作用的确切原因;我怀疑图像中没有安装字体。我将alpha添加到所有内容中,因为我不确定这些内容是否会以某种方式相互写入。

是否有ImageMagick命令起作用?ImageMagick的版本是什么?您的命令语法是什么?您安装了哪些代理?您可以从ImageMagick 6上的
convert-version
查看,或从ImageMagick 7的
magick-version
查看。您可能需要安装freetype和fontconfig。是否按名称或字体文件本身的路径引用字体。后者是最安全的。前者需要在type.xml文件中输入每个字体,才能按名称找到。是的,我有一些ImageMagik命令,例如covert、使用多页文件合并、旋转和调整大小。我试图通过名称引用字体,但我没有尝试通过文件路径引用字体,这绝对是个好主意。label函数将在没有任何错误的情况下运行并完成,但它不会写入任何内容。我想如果它找不到字体,它会给我一个错误,但这很可能是问题所在。我会尝试一下,然后回信。@fmw42我终于回到这个问题上来了,没有任何运气。下面是我目前用于text的两行代码:constspawn=require('child-process-promise')。spawn;const fontFile=bucket.file(“folder/arial.ttf”);const fontLocal=path.join(os.tmpdir(),“temp/arial.ttf”);返回fontFile.download({destination:fontLocal})。然后(()=>{return spawn('convert'、[templacalfile'-fill'、'blue'、'-font'、fontLocal'、-pointsize'、'60'、'-gravity'、'center'、'-label'、'Insert Text Here',templacalfile');})
@BGitlin
我对谷歌云功能一无所知,但请尝试在命令中添加要转换的完整路径。明白了。是的,我尝试过这样做,但没有成功:return spawn('convert',[tempocalfile',-fill','blue','-font',''-pointsize','160','-gravity','center','-label:','TEXT HERE',tempocalfile]);我之前评论中的格式与我在下载和操作GCF中的任何其他文件时使用的格式相同,因此这似乎是最有希望的方法。