FFMPEG旋转图像

问题描述:

我想使用FFMPEG来批量调整图像大小,并且我成功地使用了bash,但是我注意到一些肖像图像被旋转为横向。 Here is the original image,但正如您在下面看到的,它会旋转。FFMPEG旋转图像

Rotated image

正如你看到的上面,图像旋转。起初,我认为这是由于我用来调整图像大小的-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 

有什么办法来阻止这种情况发生?

+0

你能提供一个示例文件吗? – LordNeckbeard

+0

@LordNeckbeard我试过了,但正如我在我的问题中所述,所有图像都超过2MB,因此我无法上传它们。 – Jaketr00

+0

使用Google Drive,Dropbox或其他(理智的)文件主机服务。 – LordNeckbeard

这里可能出现的情况是,您的文件都以横向格式存储,但其中一些文件具有EXIF标签,表明它们应该以旋转方式显示。 (许多相机会根据相机的方向自动为您拍摄的照片生成这些标签。)ffmpeg无法识别这些标签,因此图像会按照存储在文件中的原样读取。

ffmpeg主要是一个视频转换工具,而不是一个图像转换工具,所以我不认为它有任何方法来读取EXIF标签。然而,convert工具(ImageMagick的一部分)确实; you can use the -auto-orient flag to activate this feature

+0

这个答案的宝石救了我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 
+0

它仍在旋转 – Jaketr00

+0

@ Jaketr00也许有一些exif标签被ffmpeg忽略。在使用ffmpeg进行缩放之前,使用exiftool获取exif信息并保存,然后通过ffmpeg应用缩放比例,然后将保存的exif信息设置为缩放图像。 – alijandro

+0

但我不愿意为我的676张照片中的每一张都做这件事。 – Jaketr00

@ 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` 

对于其他过滤器也是如此。您只需要将此命令与您选择的过滤器相匹配即可。