如何在 Node.js 中将 SVG 转换为 PNG,包括 base64 编码的图像?

How to Convert SVG to PNG in Node.js, Including Base64-Encoded Images?

提问人:Muhammad Usman 提问时间:11/10/2023 更新时间:11/10/2023 访问量:30

问:

你好 Stack Overflow 社区,

我正在处理一个Node.js项目,我需要将SVG文件转换为PNG和JPEG格式。我的 SVG 文件的独特之处在于它们包含编码为 base64 数据的图像。我尝试过为此使用 sharp 库,但我遇到了 base64 图像无法正确渲染或最终 PNG 输出中丢失的问题。此外,我需要转换以保持最终 PNG 图像的高质量。

以下是我的具体要求:

  • 该解决方案应该可以在 Node.js 环境中实现。
  • 它需要正确处理带有嵌入式 base64 编码图像的 SVG。
  • PNG和JPEG输出的质量应该很高,保持原始SVG的保真度。

我愿意使用其他可以从 Node.js 应用程序调用的 Node.js 库或外部工具。任何示例或指针将不胜感激!

提前感谢您的帮助!

我尝试使用以下方法:

const sharp = require('sharp');
const fs = require('fs');

async function convertSvgToPng(svgFilePath) {
    const outputFilePath = svgFilePath.replace('.svg', '.png');
    const svgBuffer = fs.readFileSync(svgFilePath);

    await sharp(svgBuffer)
        .png()
        .toFile(outputFilePath);

    return outputFilePath;
}

此代码似乎不能很好地处理 SVG 中的 base64 编码图像,并且质量也不达标。

节点 .js 图像 svg png jpeg

评论


答:

0赞 Blue Water 11/10/2023 #1

这是从 SVG 和 base64 创建 jpeg 文件的示例代码。

 async function getQRForGroup(groupuuid, batch) {
  //TODO: fix this for the new host, and the new gallery URL 
  var sURLForGroup = config.BASE_HREF + '/gallery/view/' + groupuuid;
  //var b64String =  async sURLForGroup => await QRCode.toDataURL(sURLForGroup);
  var b64String = null;
  var fontSize = 18;
  var textColor = "#000000";
  var text = "Tachiba";
  var qrCodeUrl = await QRCode.toDataURL(sURLForGroup, { width: 500, margin: 5 });


  // Use sharp to open the generated QR code image
  var b64Str = await sharp(Buffer.from(qrCodeUrl.split(',')[1], 'base64'))
    .jpeg() // You can specify the output format here (e.g., png, webp, etc.)
    .toBuffer()
    .then((inputBuffer) => {
      // Use the buffer to add text to the image using the composite method
      return sharp(inputBuffer)
        .jpeg()
        .composite([
          {
            //viewbox="10 5 100 100"
            input: Buffer.from(`<svg ><text x="0" y="33" font-size="45" fill="${textColor}">${text}</text></svg>`),
            gravity: 'south', // Position of the text on the image
          },
          {
            input: Buffer.from(`
                <svg width="120" height="80">
                <rect width="100%" height="100%" fill="#ffffff"/>
                <text text-anchor="middle" alignment-baseline="central" x="60" y="55" font-size="38" fill="${textColor}">${batch}</text>
                </svg>`),
            gravity: 'center', // Position of the text on the image
          }
        ])
        .toBuffer();
    })
    .then((outputBuffer) => {
      // Convert the final image buffer to a Base64-encoded string
      b64String = outputBuffer.toString('base64');
      return b64String;
    })
    .catch((err) => {
      errorLogger('Error adding text to the QR code image:', err);
    });
  return "data:image/png;base64," + b64Str;
}

请检查。