EXIF 可交换图像文件格式

Exchangeable image file format
https://zh.wikipedia.org/wiki/EXIF

Exif 2.3官方标准(上面wiki内提取)
http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf
https://www.media.mit.edu/pia/Research/deepview/exif.html

Python Exif 解析模块
https://pypi.org/project/exif/

JPEG Rotation and EXIF Orientation 字段,(图像旋转字段解读)
https://www.impulseadventure.com/photo/exif-orientation.html

图虫EXIF查看器
https://exif.tuchong.com/

imagemagick 分析工具 identify
https://imagemagick.org/script/identify.php

分析参考:

# magick identify -verbose /Users/bytedance/Downloads/Lark20210112-201836.jpeg 
Image:
  Filename: /Users/bytedance/Downloads/Lark20210112-201836.jpeg
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Mime type: image/jpeg
  Class: DirectClass
  Geometry: 4032x3024+0+0
  Resolution: 72x72
  Print size: 56x42
  Units: PixelsPerInch
  Colorspace: sRGB
  Type: TrueColor
  Base type: Undefined
  Endianness: Undefined
  Depth: 8-bit
  Channel depth:
    Red: 8-bit
    Green: 8-bit
    Blue: 8-bit
  Channel statistics:
    Pixels: 12192768
    Red:
      min: 0  (0)
      max: 255 (1)
      mean: 89.0166 (0.349085)
      median: 31 (0.121569)
      standard deviation: 60.5416 (0.237418)
      kurtosis: -0.572173
      skewness: 0.588149
      entropy: 0.94586
    Green:
      min: 0  (0)
      max: 255 (1)
      mean: 109.909 (0.431016)
      median: 29 (0.113725)
      standard deviation: 64.9169 (0.254576)
      kurtosis: -1.18594
      skewness: -0.20972
      entropy: 0.94162
    Blue:
      min: 0  (0)
      max: 255 (1)
      mean: 133.504 (0.523543)
      median: 35 (0.137255)
      standard deviation: 73.5451 (0.288412)
      kurtosis: -1.30359
      skewness: -0.406024
      entropy: 0.932756
  Image statistics:
    Overall:
      min: 0  (0)
      max: 255 (1)
      mean: 110.81 (0.434548)
      median: 31.6667 (0.124183)
      standard deviation: 66.3345 (0.260135)
      kurtosis: -1.2888
      skewness: 0.0306381
      entropy: 0.940079
  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: 4032x3024+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: JPEG
  Quality: 87
  Orientation: RightTop
  Convex hull: 0,0 4031,0 4031,3022 4030,3023 0,3023 0,0 
  Minimum bounding box: 4031,0 4031,3023 0,3023 0,0 
  Profiles:
    Profile-app4: 901284 bytes
    Profile-exif: 2971 bytes
  Properties:
    date:create: 2021-01-12T12:18:38+00:00
    date:modify: 2021-01-12T12:16:06+00:00
    exif:ApertureValue: 169/100
    exif:BrightnessValue: 421/100
    exif:ColorSpace: 1
    exif:ComponentsConfiguration: 1, 2, 3, 0
    exif:DateTime: 2021:01:05 12:06:42
    exif:DateTimeDigitized: 2021:01:05 12:06:42
    exif:DateTimeOriginal: 2021:01:05 12:06:42
    exif:ExifOffset: 207
    exif:ExifVersion: 48, 50, 50, 48
    exif:ExposureBiasValue: 0/6
    exif:ExposureMode: 0
    exif:ExposureProgram: 2
    exif:ExposureTime: 1/1392
    exif:Flash: 16
    exif:FlashPixVersion: 48, 49, 48, 48
    exif:FNumber: 180/100
    exif:FocalLength: 4229/1000
    exif:FocalLengthIn35mmFilm: 21
    exif:GPSInfo: 2959
    exif:ImageLength: 3024
    exif:ImageWidth: 4032
    exif:InteroperabilityOffset: 2929
    exif:LightSource: 0
    exif:Make: Xiaomi
    exif:MaxApertureValue: 169/100
    exif:MeteringMode: 2
    exif:Model: MIX 3
    exif:PhotographicSensitivity: 100
    exif:PixelXDimension: 4032
    exif:PixelYDimension: 3024
    exif:SceneCaptureType: 0
    exif:SceneType: 1
    exif:SensingMethod: 1
    exif:ShutterSpeedValue: 10443/1000
    exif:SubSecTime: 629625
    exif:SubSecTimeDigitized: 629625
    exif:SubSecTimeOriginal: 629625
    exif:thumbnail:InteroperabilityIndex: R98
    exif:thumbnail:InteroperabilityVersion: 48, 49, 48, 48
    exif:WhiteBalance: 0
    exif:YCbCrPositioning: 1
    jpeg:colorspace: 2
    jpeg:sampling-factor: 2x2,1x1,1x1
    minimum-bounding-box:_p: 0,0
    minimum-bounding-box:_q: 4031,0
    minimum-bounding-box:_v: 4030,3023
    minimum-bounding-box:angle: 0
    minimum-bounding-box:area: 1.21857e+07
    minimum-bounding-box:height: 4031
    minimum-bounding-box:unrotate: -0
    minimum-bounding-box:width: 3023
    signature: 42b124e4f580b814e965490ff52904e4f72a123e9605766ba554c32586905476
    unknown: 145, 7, 177, 17, 84, 21, 100, 67, 172, 62, 201, 197, 208, 3, 64, 103, 90, 143, 68, 53, 5, 7, 227, 66, 44, 202, 229, 139, 166, 242, 235, 90, 41, 32, 162, 63, 48, 90, 52, 234, 177, 7, 89, 202, 218, 9, 174, 14, 101, 63, 185, 96, 7, 152, 21, 155, 238, 118, 117, 120, 189, 179, 183, 242, 92, 58, 72, 11, 199, 38, 127, 44, 109, 209, 30, 68, 204, 118, 66, 203, 98, 92, 117, 55, 140, 192, 103, 25, 2, 99, 176, 184, 19, 244, 199, 255, 228, 247, 177, 51, 109, 223, 38, 81, 74, 204, 5, 74, 4, 168, 178, 241, 253, 119, 32, 96, 106, 89, 80, 88, 169, 16, 157, 238, 36, 166, 127, 162, 104, 240, 106, 189, 8, 20, 129, 175, 4, 83, 83, 10, 40, 151, 104, 138, 173, 97, 4, 229, 113, 126, 20, 242, 69, 177, 45, 42, 145, 62, 15, 5, 71, 168, 166, 46, 50, 228, 164, 129, 79, 130, 254, 71, 118, 16, 87, 61, 136, 183, 152, 102, 81, 36, 189, 186, 38, 119, 6, 43, 217, 51, 87, 11, 1, 113, 227, 93, 166, 193, 63, 91, 246, 154, 141, 21, 124, 138, 125, 134, 205, 173, 97, 187, 177, 225, 118, 61, 174, 213, 212, 7, 249, 73, 230, 145, 76, 130, 4, 166, 171, 18, 96, 229, 215, 218, 154, 211, 55, 93, 11, 89, 41, 43, 135, 201, 9, 87, 248, 135, 56, 33, 81, 87, 21, 71, 18, 189, 184, 66, 25, 45, 121, 157, 20, 53, 138, 157, 57, 174, 167, 121, 35, 245, 110, 224, 212, 118, 35, 121, 38, 57, 130, 91, 84, 44, 7, 131, 35, 54, 231, 147, 66, 16, 152, 101, 112, 152, 146, 156, 45, 143, 111, 165, 160, 53, 232, 244, 203, 240, 70, 138, 116, 140, 226, 190, 229, 78, 10, 123, 213, 140, 202, 91, 109, 252, 10, 134, 148, 215, 134, 91, 227, 103, 126, 141, 228, 49, 41, 72, 234, 28, 131, 84, 40, 219, 73, 243, 250, 49, 207, 156, 154, 44, 238, 208, 27, 220, 97, 153, 64, 138, 214, 45, 184, 212, 17, 48, 231, 112, 25, 240, 97, 220, 37, 92, 125, 237, 27, 78, 34, 136, 49, 100, 65, 7, 65, 255, 173, 80, 74, 179, 52, 33, 15, 206, 16, 83, 50, 202, 126, 226, 96, 176, 155, 243, 134, 216, 176, 42, 209, 90, 147, 168, 128, 4, 208, 175, 121, 251, 161, 151, 96, 152, 181, 17, 66, 43, 184, 100, 31, 137, 249, 153, 240, 165, 197, 217, 163, 166, 10, 180, 14, 64, 51, 193, 247, 92, 116, 120, 30, 198, 74, 215, 145, 159, 103, 62, 240, 150, 245, 209, 205, 242, 81, 85, 205, 168, 49, 95, 87, 186, 209, 47, 5, 217, 3, 66, 238, 64, 159, 53, 240, 249, 90, 113, 44, 233, 194, 207, 164, 151, 147, 201, 8, 135, 38, 169, 68, 192, 161, 40, 14, 180, 87, 25, 243, 92, 58, 42, 113, 189, 137, 47, 132, 184, 80, 75, 95, 89, 90, 58, 134, 21, 45, 115, 122, 252, 186, 89, 39, 205, 250, 173, 119, 191, 253, 218, 186, 0, 111, 169, 160, 114, 116, 176, 214, 78, 192, 196, 68, 133, 115, 48, 209, 153, 223, 176, 194, 97, 21, 101, 111, 102, 121, 82, 230, 9, 68, 27, 5, 167, 240, 216, 10, 130, 65, 142, 30, 52, 46, 78, 253, 13, 188, 182, 216, 101, 6, 129, 32, 10, 126, 37, 107, 15, 169, 34, 57, 31, 96, 242, 207, 146, 137, 250, 20, 231, 142, 131, 167, 237, 32, 214, 222, 213, 188, 210, 187, 48, 195, 94, 64, 89, 12, 243, 236, 69, 51, 95, 33, 111, 146, 210, 170, 246, 191, 255, 166, 153, 195, 104, 20, 246, 112, 73, 99, 116, 14, 191, 105, 172, 78, 53, 123, 55, 49, 197, 218, 122, 180, 118, 35, 63, 29, 9, 113, 168, 134, 237, 82, 229, 89, 235, 252, 64, 207, 128, 43, 159, 94, 63, 175, 79, 254, 69, 246, 72, 13, 224, 244, 144, 79, 128, 187, 126, 45, 42, 94, 98, 180, 235, 158, 110, 175, 84, 96, 214, 41, 182, 141, 189, 194, 148, 251, 188, 150, 222, 50, 120, 2, 225, 49, 122, 160, 117, 125, 195, 7, 122, 223, 38, 140, 228, 33, 16, 240, 4, 171, 74, 184, 214, 85, 163, 67, 244, 142, 168, 178, 25, 115, 211, 47, 148, 214, 221, 133, 46, 165, 119, 65, 145, 241, 170, 107, 195, 118, 48, 231, 116, 149, 178, 7, 40, 189, 94, 94, 142, 113, 253, 209, 74, 223, 73, 83, 211, 52, 94, 94, 243, 91, 196, 208, 55, 15, 126, 144, 227, 88, 251, 118, 80, 81, 31, 14, 96, 42, 85, 12, 103, 4, 12, 21, 118, 179, 132, 56, 152, 186, 181, 163, 242, 226, 182, 58, 200, 21, 158, 251, 184, 120, 224, 47, 56, 222, 136, 53, 16, 136, 247, 107, 124, 59, 156, 59, 175, 68, 115, 3, 211, 233, 210, 250, 17, 26, 41, 17, 140, 114, 154, 193, 123, 31, 212, 42, 138, 13, 204, 61, 109, 41, 93, 109, 56, 168, 240, 197, 232, 160, 36, 182, 254, 141, 224, 117, 104, 151, 216, 145, 102, 13, 175, 89, 249, 237, 193, 39, 30, 165, 79, 17, 234
  Artifacts:
    verbose: true
  Tainted: False
  Filesize: 2.62243MiB
  Number pixels: 12.1928M
  Pixels per second: 49.273MP
  User time: 0.240u
  Elapsed time: 0:01.247
  Version: ImageMagick 7.0.10-54 Q16 x86_64 2021-01-02 https://imagemagick.org

python 模块 exifread 获取:

import exifread
from PIL import Image

def read_img_and_correct_exif_orientation(path):
    im = Image.open(path)
    tags = {}
    with open(path, 'rb') as f:
        tags = exifread.process_file(f, details=False)
    if "Image Orientation" in tags.keys():
        orientation = tags["Image Orientation"]
        print("Orientation: %s (%s)", orientation, orientation.values)
        val = orientation.values
        if 5 in val:
            val += [4,8]
        if 7 in val:
            val += [4, 6]
        if 3 in val:
            print("Rotating by 180 degrees.")
            im = im.transpose(Image.ROTATE_180)
        if 4 in val:
            print("Mirroring horizontally.")
            im = im.transpose(Image.FLIP_TOP_BOTTOM)
        if 6 in val:
            print("Rotating by 270 degrees.")
            im = im.transpose(Image.ROTATE_270)
        if 8 in val:
            print("Rotating by 90 degrees.")
            im = im.transpose(Image.ROTATE_90)
    return im


im = read_img_and_correct_exif_orientation("/Users/a/Downloads/test.jpeg")
print("im : {}".format(im))

输出结果:

Orientation: %s (%s) Rotated 90 CW [6]
Rotating by 270 degrees.
im : <PIL.Image.Image image mode=RGB size=3024x4032 at 0x10186C580>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值