Imagemagick创建大拇指

时间:2013-05-13 23:09:23

标签: php imagemagick

我有一个管网站,我正在使用此功能从视频文件生成拇指

$thumbwidth = 240; //thumb width
$thumbheight = 180; //thumb height

$imagick_command = "-modulate 110,102,100 -sharpen 1x1 -enhance";

shell_exec("$ffmpeg_path -ss $first -i \"".$row[file]."\" -vcodec mjpeg -vframes 1 -an -f rawvideo -s ".$thumbwidth."x".$thumbheight." \"$image\"");

shell_exec("/usr/local/bin/mogrify $imagick_command $image"); 

这是拇指的结果,这个图像正是我需要的,没有边框等等。

enter image description here

但有时依赖于视频,我有像这样的拇指

enter image description here

什么是从拇指中移除此黑色空间的最佳方法,但需要保持拇指大小240x180

2 个答案:

答案 0 :(得分:1)

你需要:

  1. 使用保持宽高比的ffmpeg调整图像大小,使其不添加任何边框。以下是-vf scale=".$thumbwidth.":trunc(ow/a/2)*2

  2. 将图像调整为您想要的确切尺寸。以下是-resize ".$thumbwidth."x".$thumbheight."\!

  3. 所以新的命令集应如下所示:

    $thumbwidth = 240; //thumb width
    $thumbheight = 180; //thumb height
    
    $imagick_command = "-modulate 110,102,100 -sharpen 1x1 -enhance -resize ".$thumbwidth."x".$thumbheight."\!";
    
    shell_exec("$ffmpeg_path -ss $first -i \"".$row[file]."\" -vcodec mjpeg -vframes 1 -an -f rawvideo -vf scale=".$thumbwidth.":trunc(ow/a/2)*2 \"$image\"");
    
    shell_exec("/usr/local/bin/mogrify $imagick_command $image");
    

    使用上一个Sept的构建版本对ffmpeg进行测试,并将参数设置为实际值,以便于阅读:

    ffmpeg -ss 1 -i GOPR9876.MP4 -vcodec mjpeg -vframes 1 -an -f rawvideo -vf scale=240:trunc\(ow/a/2\)*2 "foo.jpg"
    

答案 1 :(得分:0)

使用ffmpeg缩放滤镜创建一个溢出240x180像素区域的缩略图。

想象一下,你有一个320x256像素的视频。要获得240的宽度,您需要使用因子0.75进行缩放。要获得180的高度,您需要使用0.70进行缩放。如果您最多使用两个因子,您将获得尺寸为240x192的缩略图,溢出目标区域而没有任何黑色边框。

接下来做中央裁剪以获得完美的240x180缩略图,上下移动6px。

如果视频高度大于宽度,则数学运算相同。调整大小后,您将获得一个高度为180且宽度稍大的缩略图,裁剪将采用它的中心部分,使其完美。

使用ffmpeg,您可以在过滤器链中使用缩放和裁剪过滤器:

-vf scale='iw*max(240/iw\, 180/ih):-1', crop=240:180`

从外部输入创建命令行字符串时,应使用escapeshellarg()。这是您可以使用的PHP代码:

<?php

// static configuration - safe
$thumbwidth = 240;
$thumbheight = 180;
$ffmpeg_path = 'ffmpeg';

// foreign input - unsafe
$first = '00:00:30';
$row = array('file' => '/home/goran/File Name.avi');
$image = '/home/goran/File Name.jpg';

$cmd = sprintf('%s ' .
    '-ss %s -i %s -vcodec mjpeg -vframes 1 -an -f rawvideo ' .
    '-vf scale=\'iw*max(%d/iw\, %d/ih):-1\', crop=%d:%d '.
    '%s',
    $ffmpeg_path,
    escapeshellarg($first), escapeshellarg($row['file']),
    $thumbwidth, $thumbheight, $thumbwidth, $thumbheight,
    escapeshellarg($image));

shell_exec($cmd);