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]
的方式来尝试解决
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;
};
视频时长获取
如果直接截取视频的某一帧的话会出现截取不到或者首帧为空白,后者这种粗暴的做法会导致页面上的所有视频的缩略图都可能是【广电龙头】