ios 解码iPhone拍摄的照片的.AAE文件中的adjustmentData

qco9c6ql  于 2022-12-15  发布在  iOS
关注(0)|答案(3)|浏览(308)

我理解.AAE文件应该描述应用于某张图片的更改。然而,我看到大多数时候(显然并不总是)有这样的文件,即使它们似乎携带相同的数据(这似乎表明没有更改应用于图片)。
有人知道如何解码这个adjustmentData值吗?
示例照片1:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>adjustmentBaseVersion</key>
    <integer>0</integer>
    <key>adjustmentData</key>
    <data>
    bZBNT8JAEIb/y5wrKaBg9mbwIBdJNNGD8TC003bNfjS7U5CQ/nenW0o4eNt95+t9nzNY
    YiyREdQZLEam8EK6bhjUfb5cZBftU5fcgFosVo8Z+KDJMbL2DtSqz6DywSJ/UIhJmmdw
    GN9bV/lh8b7Tpnzt7J4CKJivnx9yyADb9joD8o9FQxbf6KBHLc+gNcjDdmnQu3eQW1j+
    dJGtGIigvs7/3CaHe0MlKA4dyVZi1q6Og48THtNaSVBrh2YTfDv1/e6SmOrRYhACFZoo
    leMYfuRxmtqWa0EROeBAi9yTqw2BupNp7Nhfh5sLzRFd4V0acTxRzm/FC+YhuOZieEli
    XUpYXenELjmeiG9vK4W3MyFqaNY2Xgz03/0f
    </data>
    <key>adjustmentEditorBundleID</key>
    <string>com.apple.camera</string>
    <key>adjustmentFormatIdentifier</key>
    <string>com.apple.photo</string>
    <key>adjustmentFormatVersion</key>
    <string>1.6</string>
    <key>adjustmentTimestamp</key>
    <date>2020-03-21T17:37:31Z</date>
</dict>
</plist>

示例照片2:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>adjustmentBaseVersion</key>
    <integer>0</integer>
    <key>adjustmentData</key>
    <data>
    bZBNT8JAEIb/y5wrKaBg9mbwIBdJNNGD8TC003bNfjS7U5CQ/nenW0o4eNt95+t9nzNY
    YiyREdQZLEam8EK6bhjUfb5cZBftU5fcgFosVo8Z+KDJMbL2DtSqz6DywSJ/UIhJmmdw
    GN9bV/lh8b7Tpnzt7J4CKJivnx9yyADb9joD8o9FQxbf6KBHLc+gNcjDdmnQu3eQW1j+
    dJGtGIigvs7/3CaHe0MlKA4dyVZi1q6Og48THtNaSVBrh2YTfDv1/e6SmOrRYhACFZoo
    leMYfuRxmtqWa0EROeBAi9yTqw2BupNp7Nhfh5sLzRFd4V0acTxRzm/FC+YhuOZieEli
    XUpYXenELjmeiG9vK4W3MyFqaNY2Xgz03/0f
    </data>
    <key>adjustmentEditorBundleID</key>
    <string>com.apple.camera</string>
    <key>adjustmentFormatIdentifier</key>
    <string>com.apple.photo</string>
    <key>adjustmentFormatVersion</key>
    <string>1.6</string>
    <key>adjustmentTimestamp</key>
    <date>2020-03-25T05:45:21Z</date>
</dict>
</plist>
2g32fytz

2g32fytz1#

不幸的是,这还不是一个完整的答案。它可能会帮助一些人,但有更多的东西,我不明白。
我找到的最有用的答案来自http://rae.tnir.org/archives/2016/02/data-inside-apples-aae-files,他获取data属性的内容,并通过base64解码器运行,然后得到一个二进制plist,他将其转换为与照片慢动作设置相关的可理解的XML。
让我们做得更详细些。
从他的adjustmentData信息开始:

<key>adjustmentData</key>
    <data>
    YnBsaXN0MDDRAQJac2xvd01vdGlvbtIDBAUXV3JlZ2lvbnNUcmF0ZaEG0QcIWXRpbWVS
    YW5nZdIJCgsUVXN0YXJ0WGR1cmF0aW9u1AwNDg8QERITVWZsYWdzVXZhbHVlWXRpbWVz
    Y2FsZVVlcG9jaBABEQEMEQJYEADUDA0ODxUWEhMQAxEC4SI+AAAACAsWGyMoKi03PEJL
    VFpganBydXh6g4WIAAAAAAAAAQEAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAI0=
    </data>

我们将对data值进行base64解码。空格和换行符似乎并不重要。使用https://www.opinionatedgeek.com/codecs/base64decoder是因为我们希望保存结果,因为它本身是二进制的,而只显示文本结果的转换器将无法正确地呈现它。复制data字段(YnBs.....AAI0=),解码它,然后下载生成的文件。注意,它以bplist开头,表示它是一个在Apple生态系统中使用的二进制plist。
现在我们需要解码二进制plist。他没有解释怎么做,但其他网站声称你可以在TextMate中打开它,它知道如何显示它。确实如此。苹果在上面的评论中的另一个建议是运行plutil -convert xml1 TheDownloadedFile。并将文件从二进制版本就地修改为XML版本。(这两种方法在我借来测试的Mac上似乎都能用。)不过我用的是Windows,这两种方法都没有用。不过我还是找到了一个适用于NotepadNotepad++ bplist plugin。Notepad显示的最终结果是

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>slowMotion</key>
    <dict>
        <key>regions</key>
        <array>
            <dict>
                <key>timeRange</key>
                <dict>
                    <key>start</key>
                    <dict>
                        <key>flags</key>
                        <integer>1</integer>
                        <key>value</key>
                        <integer>268</integer>
                        <key>timescale</key>
                        <integer>600</integer>
                        <key>epoch</key>
                        <integer>0</integer>
                    </dict>
                    <key>duration</key>
                    <dict>
                        <key>flags</key>
                        <integer>3</integer>
                        <key>value</key>
                        <integer>737</integer>
                        <key>timescale</key>
                        <integer>600</integer>
                        <key>epoch</key>
                        <integer>0</integer>
                    </dict>
                </dict>
            </dict>
        </array>
        <key>rate</key>
        <real>0.125000</real>
    </dict>
</dict>
</plist>

另见decoding data from plist fileThe writeup链接在一个评论中也很有帮助。他的plist不是一个AAE图像,但同样的过程工作。我会怀疑它会为任何plist
除了你还有我我不知道为什么。
此原始问题中的adjustmentDatadata值未解码为以bplist开头的内容。相同的解码器(https://www.opinionatedgeek.com/codecs/base64decoder)将其解码为:

mO@@†˜+) 箠I4у൓0´v̾4»þ§J8xڽ誽ŸXb,‘ҙ,F¦Bºӽ¾d쓗܀Z,V籲ϠPˆšpޛWΐ¦(˜Ÿrƀܶ:ࠨG-Ϡ5ɃviлwXþ‘ˆ¾ÿ&‡C%(Ȗb֮ŽҚIPk‡|;˜Тš•~㱚ږkA9@‹“
“헟‡ˑ]ۚq<QͯË䡸塸Ib]JX]ꂮ9žoo+…3!jhԶ^ໟ

我在其他解码器上没有比这更成功的了,也没有比这更乱的空格了。我在AAE上也遇到了同样的问题,正是这个问题让我自己陷入了困境。我注意到,你我都有data,其中包含频繁的/字符,而我链接的两个成功故事却没有。对我来说,它们“感觉”像是不同的编码,但我不是编码Maven。
我也有点怀疑原始AAE中的adjustmentFormatVersion。工作示例早在1.1上。我们的是1.4和1.6。我想知道内容是否曾经是二进制plist,但现在不再是了。

6qfn3psc

6qfn3psc2#

adjustmentData是JSON字符串,先用zlib压缩,然后用base64编码。我自己没有弄清楚,ojchase指向base64编码,然后我在www.example.com找到了其余https://github.com/neilpa/photohack/issues/4#issuecomment-780872343https://github.com/RhetTbull/osxphotos/issues/384告诉我,在某些情况下,格式是不同的,但目前我没有任何例子可以检查。
我使用python来解码adjustmentData,因为我发现它有一些相关的库:

代码在Windows 10上使用Python 3.9.12进行了测试。使用iPhone SE(第2代)iOS版本16.1.1中的AAE文件进行了测试,但脚本包含pjp中的adjustmentData来回答问题。两个示例AAE文件都包含相同的adjustmentData。

import base64
import zlib
import json

# adjustmentData merged into one continuous string without whitespaces, stored as bytestring
adjustmentData = b"bZBNT8JAEIb/y5wrKaBg9mbwIBdJNNGD8TC003bNfjS7U5CQ/nenW0o4eNt95+t9nzNYYiyREdQZLEam8EK6bhjUfb5cZBftU5fcgFosVo8Z+KDJMbL2DtSqz6DywSJ/UIhJmmdwGN9bV/lh8b7Tpnzt7J4CKJivnx9yyADb9joD8o9FQxbf6KBHLc+gNcjDdmnQu3eQW1j+dJGtGIigvs7/3CaHe0MlKA4dyVZi1q6Og48THtNaSVBrh2YTfDv1/e6SmOrRYhACFZooleMYfuRxmtqWa0EROeBAi9yTqw2BupNp7Nhfh5sLzRFd4V0acTxRzm/FC+YhuOZieEliXUpYXenELjmeiG9vK4W3MyFqaNY2Xgz03/0f"

# Decode base64 encoded bytes. This will result some not-readable binary data
adjustmentData_decoded = base64.b64decode(adjustmentData)

# Decompress
adjustmentData_decompressed = zlib.decompress(adjustmentData_decoded, -zlib.MAX_WBITS)
adjustmentData_json = json.loads(adjustmentData_decompressed)
    
print(json.dumps(adjustmentData_json, indent=2))

输出为:

{
  "metadata": {
    "masterHeight": 4032,
    "masterWidth": 2268,
    "orientation": 6
  },
  "formatVersion": 1,
  "versionInfo": {
    "buildNumber": "17D50",
    "appVersion": "",
    "schemaRevision": 0,
    "platform": "iOS"
  },
  "adjustments": [
    {
      "formatVersion": 1,
      "enabled": true,
      "settings": {
        "yaw": 0,
        "originalCrop": true,
        "xOrigin": 0,
        "smart": false,
        "width": 4032,
        "yOrigin": 378,
        "straightenAngle": 0,
        "auto": false,
        "height": 2268,
        "constraintHeight": 0,
        "constraintWidth": 0,
        "pitch": 0
      },
      "identifier": "Crop",
      "formatIdentifier": "com.apple.photo"
    }
  ]
}

其他经验:

  • 如果我们不编辑照片,我们仍然可以有AAE文件。根据我的经验,如果我们使用16:9的宽高比会发生这种情况。然后iPhone存储原始的4:3照片,并通过AAE文件应用宽高比。这使得有可能修改照片的比例和方向在编辑器以后。
  • 如果我通过USB将iPhone连接到PC,然后通过Windows文件资源管理器浏览照片,对于我看到的每张照片:
  • 存储了两个几乎相同的AAE文件。唯一的区别是其中一个包含adjustmentRenderTypes xml PropertyList键
  • 两个HEIC文件:IMG_<number>.HEICIMG_E<number>.HEIC。第一个是原始的4:3图像,第二个似乎应用了AAE编辑。

Screenshot of File Explorer

8yparm6h

8yparm6h3#

adjustmentData可能是Apple's PhotoKit documentation中提到的特定于应用的边车数据:
此对象提供应用程序定义的“配方”,您可以使用它来重建编辑。
编辑资源时,“照片”会存储一个PHAdjustmentData对象,该对象由编辑资源的应用(或扩展)提供。此对象提供使用资源内容的以前版本重建已编辑资源所需的任何信息。当用户尝试使用您的扩展编辑资源时,“照片”会调用此块以了解您的扩展是否可以处理资源的过去调整。
由于这是特定于应用程序的数据,并且现在是高度编码的(不再只是二进制plist),我猜想它是某种归档的NSData对象(示例custom implementation),但是,如果不知道字节Map到什么(Photos.app编码器做什么,需要任何枚举),我们可能无法进一步解码这些数据。(我的系统上有版本为1.8的AAE文件,以供参考。)
截至iOS 8(2014),这些都是probably easily-decodable。如果我们曾经 * 做 * 找到或反向工程一些参考代码(从Photos.app或其他),应该很容易编码到一个.swift shell 脚本的信息。

相关问题