nodejs批量读取图像接口,然后保存到excel,但是有时候长度图像base64后长度超过32767,excel报错了

nodejs批量读取图像接口,然后保存到excel,但是有时候长度图像base64后长度超过32767,excel报错了,怎么有效压缩头像?

图片不要放在excel里面,可以作为超链接。

在 Node.js 中,可以使用第三方模块 jimp 来对图片进行处理和压缩。

具体操作如下:

安装 jimp 模块:
npm install jimp


加载图片并压缩

const Jimp = require('jimp');

const imagePath = 'path/to/image.jpg';

// 加载图片
Jimp.read(imagePath, (err, image) => {
  if (err) throw err;

  // 压缩图片到指定尺寸
  const compressedImage = image.resize(400, Jimp.AUTO);

  // 转换成 base64 编码
  const base64Image = compressedImage.getBase64Async(Jimp.MIME_JPEG);

  // 将 base64 编码保存到 excel 文件中
  // ...
});


在压缩图片时,可以通过 resize() 方法设置图片的尺寸,以达到压缩图片的目的。同时,可以通过 getBase64Async() 方法将图片转换成 base64 编码,并将其保存到 excel 文件中。

需要注意的是,对于一些特别大的图片,即使压缩后也可能超过 excel 的单元格限制,此时可以考虑将图片进行分割,分割成多个小图片并分别保存到 excel 中。

参考GPT和自己的思路:可以使用图片压缩算法来减小图片的大小,从而避免base64后的长度超过限制。常用的图片压缩算法有JPEG、PNG等。如果使用Node.js,可以使用一些开源的库来进行图片压缩,如Sharp、Jimp等。

以下是使用Sharp库进行图片压缩的示例代码:

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

// 读取原始图片
const inputBuffer = fs.readFileSync('original.jpg');

// 压缩图片,设定输出质量为80%
sharp(inputBuffer).jpeg({quality: 80}).toBuffer((err, outputBuffer) => {
  if (err) {
    console.error(err);
    return;
  }

  // 将压缩后的图片输出到文件中
  fs.writeFileSync('compressed.jpg', outputBuffer);
});


在上述代码中,我们首先使用fs模块读取原始图片,然后使用Sharp库对其进行压缩,设定输出质量为80%,最后将压缩后的图片输出到文件中。

如果你需要将压缩后的图片转换为base64格式,可以使用Node.js内置的Buffer对象的toString方法将其转换为base64编码。例如:

const base64String = outputBuffer.toString('base64');


使用以上方法可以在保证图片质量的前提下减小图片的大小,避免Excel报错。

参考GPT,当图像的Base64编码长度超过32767时,可以使用数据压缩算法来有效地压缩图像数据。以下是一些可能有用的方法:

1.使用压缩库:您可以使用像zlib或gzip这样的数据压缩库来压缩图像数据。这些库提供了压缩和解压缩函数,您可以将图像数据传递给这些函数以压缩和解压缩数据。您可以在Node.js中使用Node.js内置的zlib库或使用第三方库例如pako或zlibjs。

2.使用更高效的图像格式:您可以将图像转换为更高效的图像格式,例如WebP或JPEG 2000。这些格式使用更少的存储空间来存储相同的图像,因此可以减少Base64编码后的数据长度。您可以使用Node.js中的Sharp库将图像转换为这些格式之一。

3.压缩Base64编码:您可以使用Base64编码的压缩版本,例如Base64url编码或Base64编码的gzip压缩版本。这些编码可以在将图像数据传输到Excel之前应用,以减少数据长度。

请注意,使用这些方法可能会导致一些性能开销,因为压缩和解压缩数据需要一些计算时间。

以下是基于最新版ChatGPT4的回复,如有其他需求可以询问,希望采纳哈💕
当图像的Base64编码后长度超过32767时,确实会导致Excel出现错误。为了解决这个问题,你可以尝试以下方法来压缩头像:

调整图像尺寸:在将图像转换为Base64之前,可以先调整图像的尺寸。这将减少图像的像素数量,从而降低其Base64编码后的长度。使用sharp库来调整图像尺寸:

const sharp = require('sharp');

async function resizeImage(buffer, width, height) {
  return await sharp(buffer)
    .resize(width, height)
    .toBuffer();
}

降低图像质量:在将图像转换为Base64之前,你可以减少图像的质量。这会导致图像失真,但有助于减小Base64编码后的长度。同样,可以使用sharp库来压缩图像:

const sharp = require('sharp');

async function compressImage(buffer, quality) {
  return await sharp(buffer)
    .jpeg({ quality: quality })
    .toBuffer();
}

使用更高效的图像格式:将图像转换为更高效的图像格式,如WebP,以减小其Base64编码后的长度。sharp库也支持WebP格式:

const sharp = require('sharp');

async function convertToWebP(buffer, quality) {
  return await sharp(buffer)
    .webp({ quality: quality })
    .toBuffer();
}

在进行上述操作之后,你可以将处理后的图像转换为Base64编码,并将其保存到Excel中。例如,使用fs和exceljs库来读取图像文件并将其保存到Excel中:

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

async function processImagesAndSaveToExcel(imagePaths, outputPath) {
  const workbook = new ExcelJS.Workbook();
  const worksheet = workbook.addWorksheet('Images');

  for (let i = 0; i < imagePaths.length; i++) {
    const imageBuffer = fs.readFileSync(imagePaths[i]);
    const resizedBuffer = await resizeImage(imageBuffer, 100, 100); // 调整图像尺寸
    const compressedBuffer = await compressImage(resizedBuffer, 80); // 降低图像质量
    const webpBuffer = await convertToWebP(compressedBuffer, 80); // 转换为WebP格式

    const base64Image = webpBuffer.toString('base64');
    worksheet.addRow({ image: base64Image }).commit();
  }

  await workbook.xlsx.writeFile(outputPath);
}

const imagePaths = ['image1.jpg', 'image2.jpg', 'image3.jpg'];
const outputPath = 'output.xlsx';
processImagesAndSaveToExcel(imagePaths, outputPath);


请注意,这只是一个示例实现,你可以根据需要调整参数和代码。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,我们需要了解一下Excel的限制。Excel 2007及以前的版本最大的单元格大小是32767个字符,因此当我们尝试将大于此大小的图像嵌入到单元格中时,Excel会抛出错误。

为了有效压缩头像,我们可以将图像转换为较小的分辨率,以减少其base64编码后的字符数。同时,我们可以使用一些优化算法来减少其大小,例如CompressJS、UglifyJS等。

以下是一个示例代码,演示了如何使用Sharp库将图片压缩到指定大小,并使用node-xlsx将图像保存到Excel中:

const sharp = require('sharp');
const xlsx = require('node-xlsx');
const fs = require('fs');
const path = require('path');

// 读取目录中所有图片并进行压缩
fs.readdir('./images', (err, files) => {
  // 创建一个xlsx文件
  const ws = xlsx.utils.aoa_to_sheet([['图片名称', '图片base64']]);

  // 遍历所有图片
  files.forEach(file => {
    const filePath = `./images/${file}`;

    // 压缩并转换图片为base64
    sharp(filePath)
      .resize(300) // 将图片调整为小于 300 像素的宽度
      .toBuffer((err, buffer) => {
        if (err) { console.error(err); return; }

        const base64Img = buffer.toString('base64');

        // 检查base64编码后的长度是否超过32767
        if (base64Img.length > 32767) {
          console.warn(`图片${file}已被压缩但是其base64编码后的长度超过了32767`);

          // 在这里可以使用其他的压缩算法进一步压缩图片
        }

        // 将图像数据添加到Excel工作表中
        xlsx.utils.sheet_add_aoa(ws, [[file, base64Img]], {origin: -1});
      });
  });

  // 保存Excel文件
  const buffer = xlsx.utils.sheet_to_buffer(ws);
  fs.writeFile('./images.xlsx', buffer, err => {
    if (err) { console.error(err); return; }
    console.log('图片已成功导出到Excel中');
  });
});

这里我们使用了Sharp库,它是一个用于压缩和调整图像大小的Node.js模块。我们使用resize函数将图像大小调整为小于300像素的宽度,以减少base64编码后的字符数。如果图像的长度仍然超过32767,我们可以使用其他的压缩算法来进一步压缩图像。

最后,我们将图像数据添加到Excel工作表中,并将工作表保存为Excel文件。
如果我的回答解决了您的问题,请采纳!

用 jimp 压缩图片