前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ImageMagick & FFMPEG 缩略图生成

ImageMagick & FFMPEG 缩略图生成

作者头像
上山打老虎了
发布2022-06-27 14:19:33
1.9K0
发布2022-06-27 14:19:33
举报
文章被收录于专栏:ArticleArticle

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;
};

视频时长获取

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

代码语言:javascript
复制
// 时长 单位秒
const duration = Number(
  execSync(
    `ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 ${from}`,
    { encoding: 'utf8' },
  ).toString(),
);

转码截取缩略图

代码语言:javascript
复制
execSync(
  `ffmpeg -hide_banner -loglevel error -i ${input}  -y -f image2 -ss 00:00:${seconds} -vframes 1 -s ${width}:${height} ${output}`,
  { encoding: 'utf8' },
).toString();
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022年06月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • GIF PDF PSD 转换
  • 文件尺寸
  • 报错
  • FFMPEG 缩略图生成
    • 视频信息获取
      • 视频时长获取
      相关产品与服务
      图像处理
      图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档