在Azure Functions中使用ImageMagick或GraphicsMagick

7
我正在尝试确定公司是否可以使用Azure Functions自动转换TIFF文件为多种JPG和PNG格式和大小。我正在使用Node.js的Functions,但也可以使用其他语言。
我的问题是,我无法让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); };

我不确定是否可能,但是我没有找到任何说明它不能的信息。

那么,在Functions中可以使用ImageMagick、GraphicsMagick或第三方图像转换器吗?如果可以,安装时需要注意什么特别的问题吗?

同时,是否有C#解决方案呢?


如果可能的话,C#版本将是首选。 - Alex Gordon
Cloudinary API 可用于图像转换 https://cloudinary.com/cookbook/converting_an_image_format,从他们的页面中可以看到,它目前支持以下格式:JPG、PNG、GIF、BMP、TIFF、ICO、PDF、EPS、PSD、SVG、WebP、JXR 和 WDP。 - Ivar
3个回答

5
Azure中的Web应用是SaaS(软件即服务)。您将位移到Azure IIS容器中,Azure会处理剩余部分。我们没有太多控制权。
因此,我们将无法在Azure Functions App上安装任何第三方可执行文件(例如ImageMagick或GraphicsMagick)。如果需要这样做,请查看虚拟机。另一个选择是使用Cloud Services的Web或Worker角色。
另外,有一个非常好的图像处理库可以在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);
});

还有另一个名为sharp的node.js库可用于实现您的要求。您可以尝试以下方法:

首先,在本地环境中安装sharp,然后使用包含编译模块的node_modules文件夹将应用程序部署到Azure。最后,将Azure App Service上的node可执行文件升级为64位。

您可以参考类似的讨论这里

示例用法:

var sharp = require("sharp");

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

1
是的,我也在某处看到过不能在Azure函数上安装可执行文件......但我还是试了一下,它能正常工作!我在一个文件夹中安装了GraphicsMagick,并执行了一个子进程来运行GraphicsMagick,它确实可以转换我想要的文件。这是一个 Bug,还是设计意图?我也看了看Jimp,但它无法转换TIFF格式的图片,所以很遗憾,它不符合我的需求。 - Morten Hansen
刚刚花了4个小时尝试在Azure Functions上运行Sharp :-( 但就是无法将所有的部件组合起来。 - Simon_Weaver

3
Azure函数也可以运行自定义的Docker镜像。 https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-function-linux-custom-image 不确定您感兴趣的是哪种语言,但您可以使用以下样式的Dockerfile来创建Python镜像。
FROM mcr.microsoft.com/azure-functions/python:2.0

RUN apt-get update && \
    apt-get install -y --no-install-recommends apt-utils  && \
    apt-get install -y imagemagick

ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
    AzureFunctionsJobHost__Logging__Console__IsEnabled=true

COPY . /home/site/wwwroot

RUN cd /home/site/wwwroot && \
    pip install -r requirements.txt

然后使用PythonMagick来处理相同的内容


2

当然,在执行此操作后,您仍然需要安装npm包 :-) - Simon_Weaver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接