我正在尝试使用FFMPEG来大规模调整图像大小,并且我使用bash成功地完成了它,但我注意到一些肖像图像已经旋转到横向。 Here is the original 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 :(得分: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);