在Azure函数上使用ImageMagick或GraphicsMagick

Mor*_*sen 6 imagemagick azure node.js graphicsmagick azure-functions

我正在尝试查看我的公司是否可以使用Azure Functions自动将TIFF文件转换为许多JPG和PNG格式和大小。我正在使用带有Node.js的功能,但是可以使用其他语言。

我的问题是,我无法让GraphicsMagick或ImageMagick来使用Functions。我使用npm install使用正常的安装步骤

似乎安装正确,并且该模块也似乎已加载,但是当我尝试处理文件时没有任何反应。没有,也没有错误。

var fs = require('fs'); var gm = require('gm');

module.exports = function(context,req){context.log('Start ...');

try {
    context.log('Looking for GM...');
    context.log(require.resolve("gm"));
} catch(e) {
    console.log("GM is not found");
    process.exit(e.code);
}

gm('D:/home/site/wwwroot/HttpTriggerJS1/input/870003-02070-main-nfh.jpg')
    .resize(240, 240)
    .noProfile()
    .write('D:/home/site/wwwroot/HttpTriggerJS1/output/resize.jpg', 
    function (err) {
        context.log('TEST');
        if (!err) {
            context.log('done');
        }
    }
);

context.done(null, res); };
Run Code Online (Sandbox Code Playgroud)

我不确定这是否有可能,但是我还没有找到任何信息表明无法做到这一点。

那么,我可以在Function中使用ImageMagick,GraphicsMagick或第三个图像转换器吗?如果是,安装时我需要注意一些特别的事情吗?

还有C#解决方案吗?

Aar*_*hen 5

Azure 中的 Web 应用程序是一种 SaaS(软件即服务)。您将您的位部署到 Azure IIS 容器,剩下的工作由 Azure 完成。我们没有太多控制权。因此,我们将无权在 Azure Functions 应用程序(例如 ImageMagick 或 GraphicsMagick)上安装任何 3rd 方可执行文件。如果您需要这样做,请查看虚拟机。另一种选择是使用云服务的 Web 或工作角色。

或者,有一个很好的 Node 图像处理库,完全用 JavaScript 编写,零外部或本机依赖项,​​Jimp。https://github.com/oliver-moran/jimp

用法示例:

var Jimp = require("jimp");

Jimp.read("lenna.png").then(function (lenna) {
    lenna.resize(256, 256)            // resize
         .quality(60)                 // set JPEG quality
         .greyscale()                 // set greyscale
         .write("lena-small-bw.jpg"); // save
}).catch(function (err) {
    console.error(err);
});
Run Code Online (Sandbox Code Playgroud)

还有另一个名为sharp的node.js库可以满足您的要求。你可以试试这个方法:

首先,在本地环境中安装sharp,然后使用以下命令将应用程序部署到Azure node_modules包含已编译模块文件夹。最后,将 Azure 应用服务上的节点可执行文件升级到 64 位。

您可以在此处参考类似的线程。

用法示例:

var sharp = require("sharp");

sharp(inputBuffer)
  .resize(320, 240)
  .toFile('output.webp', (err, info) => {
      //...
  });
Run Code Online (Sandbox Code Playgroud)