FFMPEG旋转图像
我想使用FFMPEG来批量调整图像大小,并且我成功地使用了bash,但是我注意到一些肖像图像被旋转为横向。 Here is the original image,但正如您在下面看到的,它会旋转。FFMPEG旋转图像
正如你看到的上面,图像旋转。起初,我认为这是由于我用来调整图像大小的-vf scale
标志,但我尝试了下面的命令,它仍然旋转了图像。
ffmpeg -i input.jpg output.jpg
这不会发生在每个图像,甚至不是所有的肖像图像。另外,有些图像顺时针旋转,有些则逆时针旋转。这不是一个随机事件,无论我运行命令多少次,原来旋转的所有图像仍然会旋转。
控制台输出
ffmpeg version N-79942-gdc34fa6-tessus Copyright (c) 2000-2016 the FFmpeg developers
built with Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --as=yasm --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libass --enable-libbluray --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzmq --enable-version3 --disable-ffplay --disable-indev=qtkit --disable-indev=x11grab_xcb
libavutil 55. 23.100/55. 23.100
libavcodec 57. 38.100/57. 38.100
libavformat 57. 35.100/57. 35.100
libavdevice 57. 0.101/57. 0.101
libavfilter 6. 44.100/6. 44.100
libswscale 4. 1.100/4. 1.100
libswresample 2. 0.101/2. 0.101
libpostproc 54. 0.100/54. 0.100
Input #0, image2, from '/Users/jaketr00/Desktop/IMG_1902.JPG':
Duration: 00:00:00.04, start: 0.000000, bitrate: 1025494 kb/s
Stream #0:0: Video: mjpeg, yuvj422p(pc, bt470bg/unknown/unknown), 5184x3456, 25 tbr, 25 tbn
[image2 @ 0x7ff751803e00] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
Output #0, image2, to '/Users/jaketr00/Desktop/IMG_19022.JPG':
Metadata:
encoder : Lavf57.35.100
Stream #0:0: Video: mjpeg, yuvj422p(pc), 5184x3456, q=2-31, 200 kb/s, 25 fps, 25 tbn
Metadata:
encoder : Lavc57.38.100 mjpeg
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg (native) -> mjpeg (native))
Press [q] to stop, [?] for help
frame= 1 fps=0.0 q=8.2 size=N/A time=00:00:00.04 bitrate=N/A speed=0.0753x frame= 1 fps=0.0 q=8.2 Lsize=N/A time=00:00:00.04 bitrate=N/A speed=0.0752x
video:554kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
有什么办法来阻止这种情况发生?
这里可能出现的情况是,您的文件都以横向格式存储,但其中一些文件具有EXIF标签,表明它们应该以旋转方式显示。 (许多相机会根据相机的方向自动为您拍摄的照片生成这些标签。)ffmpeg无法识别这些标签,因此图像会按照存储在文件中的原样读取。
ffmpeg主要是一个视频转换工具,而不是一个图像转换工具,所以我不认为它有任何方法来读取EXIF标签。然而,convert
工具(ImageMagick的一部分)确实; you can use the -auto-orient
flag to activate this feature。
这个答案的宝石救了我30分钟后“十字军东征”。谢谢。 – thvs86
尝试将选项-noautorotate
添加到您的ffmpeg命令行中。
另外,使用exiftool
备份exif信息,通过ffmpeg应用规模后,可以提供备份exif信息。
for f in *.jpg
do
# save exif information
ffmpeg -noautorotate -i input.jpg -vf "scale=w:h" output.jpg
# retore exif information
done
@ Jaketr00,我知道这可能为时太晚,你找到这个答案,但我希望它可以帮助其他同样的问题。 您只需使用“转置”功能就可以避免此问题。 可以说你想在你的肖像图像的中间画一条红色的水平线。下面的命令可以在不需要旋转的情况下完成这项工作。输出将与您的输入文件具有相同的比例。
ffmpeg -i test.jpg -filter_complex "[0]transpose=1[tr]; color=red:s=300x500,geq=lum='p(X,Y)':a='if(eq(250,Y),255,0)'[c]; [tr][c]overlay=0:0:shortest=1" test_out.jpg`
对于其他过滤器也是如此。您只需要将此命令与您选择的过滤器相匹配即可。
你能提供一个示例文件吗? – LordNeckbeard
@LordNeckbeard我试过了,但正如我在我的问题中所述,所有图像都超过2MB,因此我无法上传它们。 – Jaketr00
使用Google Drive,Dropbox或其他(理智的)文件主机服务。 – LordNeckbeard