FFMPEG旋转图像

时间:2016-06-13 01:28:45

标签: ffmpeg

我正在尝试使用FFMPEG来大规模调整图像大小,并且我使用bash成功地完成了它,但我注意到一些肖像图像已经旋转到横向。 Here is the original image,但如下所示,它会被轮换。

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

有没有办法阻止这种情况发生?

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我遇到了同样的问题,并意识到使用ffmpeg时,图像的方向标签未保留。

原始图片

$ exiftool -Orientation input.jpg 
Orientation                     : Rotate 90 CW

完整输出:

$ identify -verbose input.jpg 
Image: input.jpg
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Mime type: image/jpeg
  Class: DirectClass
  Geometry: 4160x3120+0+0
  Resolution: 72x72
  Print size: 57.7778x43.3333
  Units: PixelsPerInch
  Colorspace: sRGB
  Type: TrueColor
  Base type: Undefined
  Endianess: Undefined
  Depth: 8-bit
  Channel depth:
    Red: 8-bit
    Green: 8-bit
    Blue: 8-bit
  Channel statistics:
    Pixels: 12979200
    Red:
      min: 0  (0)
      max: 255 (1)
      mean: 108.185 (0.424255)
      standard deviation: 61.0896 (0.239567)
      kurtosis: -0.901126
      skewness: -0.248333
      entropy: 0.945001
    Green:
      min: 0  (0)
      max: 255 (1)
      mean: 105.661 (0.414356)
      standard deviation: 60.1866 (0.236026)
      kurtosis: -0.9917
      skewness: -0.0344804
      entropy: 0.963995
    Blue:
      min: 0  (0)
      max: 255 (1)
      mean: 93.8873 (0.368186)
      standard deviation: 63.4227 (0.248716)
      kurtosis: -1.00629
      skewness: 0.325207
      entropy: 0.958324
  Image statistics:
    Overall:
      min: 0  (0)
      max: 255 (1)
      mean: 102.578 (0.402265)
      standard deviation: 61.5663 (0.241436)
      kurtosis: -1.03922
      skewness: 0.0137682
      entropy: 0.955774
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Matte color: grey74
  Background color: white
  Border color: srgb(223,223,223)
  Transparent color: none
  Interlace: None
  Intensity: Undefined
  Compose: Over
  Page geometry: 4160x3120+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: JPEG
  Quality: 98
  Orientation: RightTop
  Properties:
    date:create: 2019-05-01T16:09:43+00:00
    date:modify: 2019-05-01T16:09:43+00:00
    exif:ApertureValue: 200/100
    exif:BrightnessValue: 0/100
    exif:ColorSpace: 1
    exif:ComponentsConfiguration: 1, 2, 3, 0
    exif:DateTime: 2019:05:01 10:15:04
    exif:DateTimeDigitized: 2019:05:01 10:15:04
    exif:DateTimeOriginal: 2019:05:01 10:15:04
    exif:ExifOffset: 285
    exif:ExifVersion: 48, 50, 50, 48
    exif:ExposureBiasValue: 0/6
    exif:ExposureMode: 0
    exif:ExposureProgram: 0
    exif:ExposureTime: 9994945/1000000000
    exif:Flash: 0
    exif:FlashPixVersion: 48, 49, 48, 48
    exif:FNumber: 200/100
    exif:FocalLength: 3580/1000
    exif:FocalLengthIn35mmFilm: 0
    exif:GPSInfo: 831
    exif:ImageLength: 3120
    exif:ImageWidth: 4160
    exif:InteroperabilityOffset: 801
    exif:Make: HMD Global
    exif:MakerNote: 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 37, 0, 0, 208, 7, 33, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, 2, 104, 1, 0, 0, 0, 0
    exif:MeteringMode: 0
    exif:Model: Nokia 8
    exif:Orientation: 6
    exif:PhotographicSensitivity: 100
    exif:PixelXDimension: 4160
    exif:PixelYDimension: 3120
    exif:ResolutionUnit: 2
    exif:SceneCaptureType: 0
    exif:SceneType: 0
    exif:SensingMethod: 0
    exif:ShutterSpeedValue: 6644/1000
    exif:Software: TA-1004_00WW-user 9 PPR1.180610.011 00WW_5_14A release-keys
    exif:SubSecTime: 733
    exif:SubSecTimeDigitized: 733
    exif:SubSecTimeOriginal: 733
    exif:thumbnail:Compression: 6
    exif:thumbnail:InteroperabilityIndex: R98
    exif:thumbnail:InteroperabilityVersion: 48, 49, 48, 48
    exif:thumbnail:JPEGInterchangeFormat: 943
    exif:thumbnail:JPEGInterchangeFormatLength: 6845
    exif:thumbnail:Orientation: 6
    exif:thumbnail:ResolutionUnit: 2
    exif:thumbnail:XResolution: 72/1
    exif:thumbnail:YResolution: 72/1
    exif:WhiteBalance: 0
    exif:XResolution: 72/1
    exif:YCbCrPositioning: 1
    exif:YResolution: 72/1
    jpeg:colorspace: 2
    jpeg:sampling-factor: 2x2,1x1,1x1
    signature: d450d8dbb135c549364b3663c8195164a73698999b8104e75c8b74564835986f
  Profiles:
    Profile-exif: 7794 bytes
  Artifacts:
    verbose: true
  Tainted: False
  Filesize: 6.05972MiB
  Number pixels: 12979200
  Pixels per second: 82.8219MP
  User time: 0.150u
  Elapsed time: 0:01.156
  Version: ImageMagick 7.0.8-42 Q16 x86_64 2019-04-24 https://imagemagick.org

修改过的图片

$ exiftool -Orientation output.jpg 

完整输出:

$ identify -verbose output.jpg 
Image: output.jpg
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Mime type: image/jpeg
  Class: DirectClass
  Geometry: 1800x1350+0+0
  Units: Undefined
  Colorspace: sRGB
  Type: TrueColor
  Base type: Undefined
  Endianess: Undefined
  Depth: 8-bit
  Channel depth:
    Red: 8-bit
    Green: 8-bit
    Blue: 8-bit
  Channel statistics:
    Pixels: 2430000
    Red:
      min: 0  (0)
      max: 255 (1)
      mean: 108.075 (0.423823)
      standard deviation: 60.7286 (0.238152)
      kurtosis: -0.889179
      skewness: -0.260768
      entropy: 0.940096
    Green:
      min: 0  (0)
      max: 255 (1)
      mean: 105.629 (0.414232)
      standard deviation: 59.6505 (0.233924)
      kurtosis: -0.993155
      skewness: -0.0409431
      entropy: 0.957277
    Blue:
      min: 0  (0)
      max: 255 (1)
      mean: 93.7942 (0.367821)
      standard deviation: 63.0086 (0.247093)
      kurtosis: -1.00904
      skewness: 0.322794
      entropy: 0.957105
  Image statistics:
    Overall:
      min: 0  (0)
      max: 255 (1)
      mean: 102.499 (0.401958)
      standard deviation: 61.1293 (0.239723)
      kurtosis: -1.03828
      skewness: 0.00662106
      entropy: 0.951493
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Matte color: grey74
  Background color: white
  Border color: srgb(223,223,223)
  Transparent color: none
  Interlace: None
  Intensity: Undefined
  Compose: Over
  Page geometry: 1800x1350+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: JPEG
  Quality: 72
  Orientation: Undefined
  Properties:
    comment: Lavc58.35.100
    date:create: 2019-05-01T16:09:44+00:00
    date:modify: 2019-05-01T16:09:44+00:00
    jpeg:colorspace: 2
    jpeg:sampling-factor: 2x2,1x1,1x1
    signature: 76f0debf16f9a958b603a08a706b825e4700093b28b57470a34361b396da612d
  Artifacts:
    verbose: true
  Tainted: False
  Filesize: 105397B
  Number pixels: 2430000
  Pixels per second: 117.945MP
  User time: 0.020u
  Elapsed time: 0:01.020
  Version: ImageMagick 7.0.8-42 Q16 x86_64 2019-04-24 https://imagemagick.org

解决方案

为解决此问题,我确实在bash脚本中包含一些代码以从原始文件($file)中读取方向。然后我更新输出文件($outfile)的方向。

# read orientation from original image
orientation=$(exiftool -Orientation -n -S $file | grep -Eo '[0-9]{1,4}')

# scale image
ffmpeg -i $file -vf "scale='min($ffmpeg_maxwidth,iw)':-1" $outfile

# set orientation value for the new image
exiftool -n -Orientation=$orientation $outfile

答案 2 :(得分:0)

尝试将选项-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

答案 3 :(得分:0)

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

同样适用于任何其他过滤器。您只需要使用您选择的过滤器调整此命令。

答案 4 :(得分:0)

您将必须运行系统目录上的所有现有映像。因为ffmpeg没有可用的选项来消除对exiftool保持定向的需要。 我不想仅为这个特定问题安装并包括ImageMagick。因为我已经在使用ffmpeg进行视频转换了。

添加-noautorotate在ffmpeg命令中无效。因此,这里是@alijandro答案的更详细的版本,使用nodejs脚本,我必须使用here中的示例代码保留元数据以用于定向。同样,这也非常适合您的示例图像。

const ffmpeg = require("ffmpeg");
const exiftool = require("node-exiftool");
const exiftoolBin = require("dist-exiftool");
const sizeOf = require("image-size");

const ep = new exiftool.ExiftoolProcess(exiftoolBin);
let metaData = {};
ep.open()
  .then(() => ep.readMetadata('input-img.jpeg', ["-File:all"]))
  .then((data) => {
    console.log("meta read");
    metaData = data;
  }, console.error)
  .then((data) => {
    const d = sizeOf('input-img.jpeg');
    const sizeFactor = d.height > d.width ? `-1:${maxH}` : `${maxW}:-1`;
    exec(
     `ffmpeg -noautorotate -i input-img.jpeg -vf scale="${sizeFactor}" -y output-img.jpeg`, 
      (err) => {
        // handle error
        console.log("resized");
        ep.open()
          .then((data) => {
            console.log("meta write");
            ep.writeMetadata('output-img.jpeg', metaData.data[0], ["overwrite_original"]);
          }, console.error)
          .then(() => ep.close())
          .catch(console.error);
      }
    );
  }, console.error)
  .then(() => ep.close())
  .catch(console.error);