ImageMagick & FFMPEG 缩略图生成

2022-06-27 14:19:33 浏览数 (1)

By Noxxxx from https://www.noxxxx.com/?post_type=post&p=2068 上山打老虎 欢迎分享与聚合,尊重版权,可以联系授权

ImageMagick 在生成缩略图的过程中遇到的问题。

不推荐 NPM 上的 GM 这个库,一个原因是更新时间年代久远,第二个是最新的 ImageMagick 的 语法推荐使用 magick 而非 convert GM 库底层使用的是 convert 命令因而不能使用最新的语法。

GIF PDF PSD 转换

命令:

代码语言:javascript复制
const cmd = `magick "${input}" -resize ${scale.width}x${scale.height}  -quality 90 ${output}`;
execSync(cmd, { encoding: 'utf8' }).toString();

psd 和 pdf 在文件名上需要特殊处理,xx.psd[0] 代表着合并所有图层,xx.pdf[0] 代表获取 pdf 文件中的第一个图像,而如果你需要截取 GIF 的某一帧的图片的话,也需要在文件名后缀添加 xxx.gif[2]

文件尺寸

代码语言:javascript复制
identify -ping -format "%wx%h" 'xxx.psd[0]'

报错

代码语言:javascript复制
identify: improper image header `xxx.psd' @ error/psd.c/ReadPSDLayersInternal/1984

如果是 7.0 的版本,可以使用上面提到的文件名后缀添加 [0]的方式来尝试解决

代码语言:javascript复制
300x30038x22871x243104x253170x271202x281241x291223x280223x281220x281220x282219x282218x284218x285223x285223x270238x287236x284238x282240x282243x282243x280278x283300x288300x292300x281300x281300x197300x185 

GIF 和 webp 格式的图片在尺寸获取上如果后缀没有加 [0] 的话,同样会出现上面的宽高结果。

FFMPEG 缩略图生成

视频信息获取

代码语言:javascript复制
/**
 * 获取视频信息
 * @param path 视频路径
 * @returns 视频信息
 */
export const getVideoInfo = async (path: string) => {
  let info = null;
  const videoInfo: any = execSync(
    `ffprobe -v quiet -print_format json -show_format -show_streams -print_format json "${path}"`,
    { encoding: 'utf8' },
  ).toString();
  info = JSON.parse(videoInfo);
  const res = [
    {
      width: info.streams[0].width,
      height: info.streams[0].height,
    },
    info.format.size,
  ];
  return res;
};

视频时长获取

如果直接截取视频的某一帧的话会出现截取不到或者首帧为空白,后者这种粗暴的做法会导致页面上的所有视频的缩略图都可能是【广电龙头】

0 人点赞