iPhone实况照片从Windows资源管理器复制的JPG+MOV无法正常还原到iPhone

news2025/1/17 6:01:17

背景:

之前使用的iPhone 15 Pro,使用的Windows资源管理器当中复制导出的实况照片,复制出来的格式例如IMG_0001.JPG, IMG_0001.MOV。之后手机就卖掉了。现在使用的iPhone 14 Pro Max,想要导回之前备份的实况照片。尝试使用爱思助手导入,虽然文件名都一样,但是仍然会报错:

是不是非常可恶?

但是使用爱思助手导出实况照片、出来的也是JPG+MOV。再重新导回去,发现一切正常。这么说一定是可以导入的,肯定是哪里出了问题。

咨询了爱思助手的客服,完全不理。没办法,只好自己研究咯。


解决方法:

读取MOV的EXIF信息

exiftool -a -u -g1 IMG_4676.MOV > IMG_4676.MOV.TXT

---- Keys ----字段下面的Content Identifier键值,就是JPG需要被修改成的Media Group UUID。也就是说,实际上,他们是依据这个uuid来判断视频和照片的关联。发现爱思助手导出的JPG和MOV正好也是对应的。所以实际上,针对资源管理器复制出来的,我们只要读取MOV的这个键值,把我们从JPG当中的Media Group UUID修改成一样的即可!

# MOV
Content Identifier              : E2523D1E-7C8A-423B-A8DB-53C8A073457F

# JPG
Media Group UUID                : E2523D1E-7C8A-423B-A8DB-53C8A073457F

修改JPG当中的Media Group UUID

利用010Editor,打开文件,

直接把我原始照片里面的UUID替换掉。保存,即可导入成功。

这个UUID在文件中是明文TEXT存储的,在批量处理的情况下我们可以直接写一个脚本,利用exiftool读取出来MOV文件的Content Identifier,读取JPG的Media Group UUID,然后字节流模式打开JPG,在文件当中直接执行替换即可。

批量处理代码

Windows平台,下载exiftool:

https://exiftool.org/index.html

 

下载这个stand-alone的windows版本 。

下载下来的zip里面就是一个exe文件,重命名为exiftool.exe即可。

创建下面的python文件,把exe和这个python文件放到一个目录下面。

这个代码会将成对的JPG+MOV都拷贝到一个新的文件夹里面去。这样在原始文件夹里面的文件都是需要单独导入成静态照片和普通视频的。方便导入。在爱思助手里面就直接选择程序生成的LivePhoto文件夹。

建议在运行此代码之前,把资料先备份一份,以防万一。毕竟数据无价,谨慎操作。

import subprocess
import os
import shutil
from collections import defaultdict
import re

def get_exif_data(file_path):
    try:
        process = subprocess.Popen(
            ['exiftool', '-a', '-u', '-g1', file_path], 
            stdout=subprocess.PIPE, 
            stderr=subprocess.PIPE
        )
        stdout, stderr = process.communicate()
        
        if process.returncode != 0:
            print(f"Error: {stderr.strip()}")
            return None

        return stdout.strip()

    except FileNotFoundError:
        print("ExifTool is not installed or not found in the system path.")
        return None

def replace_uuid_in_jpg(jpg_file_path, old_uuid, new_uuid):
    with open(jpg_file_path, 'rb+') as jpg_file:
        file_content = jpg_file.read()
        updated_content = file_content.replace(old_uuid, new_uuid)
        jpg_file.seek(0)
        jpg_file.write(updated_content)
        jpg_file.truncate()

def fix_jpg_for_ios_import(jpg_file_path, mov_file_path):
    exif_data = get_exif_data(mov_file_path).split(b'\n')
    content_identifier = None
    for item in exif_data:
        if b'Content Identifier' in item:
            content_identifier = item.split(b':')[-1].strip()
            break
    assert content_identifier is not None
    assert re.match(r'[0-9A-F]{8}(-[0-9A-F]{4}){3}-[0-9A-F]{12}', content_identifier.decode().upper())
    print(b'    ' + mov_file_path.encode() + b' | ' + content_identifier)

    exif_data = get_exif_data(jpg_file_path).split(b'\n')
    media_group_uuid = None
    for item in exif_data:
        if b'Media Group UUID' in item or b'Content Identifier' in item:
            media_group_uuid = item.split(b':')[-1].strip()
            break
    assert media_group_uuid is not None
    assert re.match(r'[0-9A-F]{8}(-[0-9A-F]{4}){3}-[0-9A-F]{12}', media_group_uuid.decode().upper())
    print(b'    ' + jpg_file_path.encode() + b' | ' + media_group_uuid)
    replace_uuid_in_jpg(jpg_file_path, media_group_uuid, content_identifier)

def get_matching_files(directory):
    # 字典用于存储文件名前缀及其对应的后缀
    file_dict = defaultdict(set)
    for filename in os.listdir(directory):
        name, ext = os.path.splitext(filename)
        ext = ext.upper()
        # 只处理JPG和MOV文件
        if ext in {'.JPG', '.MOV'}:
            file_dict[name].add(ext)
    # 找到同时具有JPG和MOV后缀的文件名前缀
    matching_files = [name for name, exts in file_dict.items() if {'.JPG', '.MOV'} <= exts]
    return matching_files


if __name__ == '__main__':
    jpg_mov_path = 'I:/iPhone15Pro/202310__'
    file_prefixes = get_matching_files(jpg_mov_path)
    if not os.path.exists(os.path.join(jpg_mov_path, "LivePhoto")):
        os.mkdir(os.path.join(jpg_mov_path, "LivePhoto"))
    for file_prefix in file_prefixes:
        dst_jpg_path = os.path.join(jpg_mov_path, "LivePhoto", f"{file_prefix}.JPG")
        dst_mov_path = os.path.join(jpg_mov_path, "LivePhoto", f"{file_prefix}.MOV")
        shutil.move(os.path.join(jpg_mov_path, f"{file_prefix}.JPG"), dst_jpg_path)
        shutil.move(os.path.join(jpg_mov_path, f"{file_prefix}.MOV"), dst_mov_path)
        fix_jpg_for_ios_import(dst_jpg_path, dst_mov_path)

尝试过的方法

先用手上的iPhone 14 Pro Max随便拍两张照片,一个通过爱思导出,一个通过Windows资源管理器复制。对比一下出来的文件

很明显这两个文件大小差距很大。

MOV的话,文件大小一样,算了一下md5也一样。说明问题不在MOV上,JPG有问题。

先启动WSL,用binwalk,foremost看一下:

binwalk IMG_4676.JPG

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             JPEG image data, JFIF standard 1.01
34            0x22            TIFF image data, big-endian, offset of first image directory: 8
2828          0xB0C           TIFF image data, big-endian, offset of first image directory: 8
2214234       0x21C95A        TIFF image data, big-endian, offset of first image directory: 8
binwalk 2024_05_22_12_44_IMG_4676.JPG

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             JPEG image data, JFIF standard 1.01
30            0x1E            TIFF image data, big-endian, offset of first image directory: 8

foremost解出来两张图片。一张是全彩的正常图片(00000000.jpg),携带大量有效metadata(例如拍摄机型、时间、GPS等)。另一张点开直接看到的是灰度图像,没有看到有效的metadata。

修改文件名对应MOV,导入00000000.jpg也失败。

那么就用exiftool看一下。

exiftool -a -u -g1 IMG_4676.JPG > IMG_4676_bad.TXT
exiftool -a -u -g1 2024_05_22_12_44_IMG_4676.JPG > 2024_05_22_12_44_IMG_4676.JPG.TXT

使用Beyond Compare对比一下哪里出问题了。

存在大量不同。尤其是MP系列字段。因为本身存在2张照片

先不管MPF0字段。先尝试直接利用exiftool复制爱思助手导出图片的exif信息,直接覆盖过去:

exiftool -TagsFromFile 2024_05_22_12_44_IMG_4676.JPG -all:all IMG_4676.JPG

直接成功了!

说明只需要修改这里面不同的EXIF信息即可修复导入! 

尝试单独修改了几个项目,导入,无果。最终把目光看向了Apple字段下面的Media Group UUID

但是这个项目还不太好改,询问GPT,下面这个方法不好用。

exiftool -Apple:MediaGroupUUID="E2523D1E-7C8A-423B-A8DB-53C8A073457F" IMG_4676.JPG
Warning: [minor] Maker notes could not be parsed - IMG_4676.JPG
    0 image files updated
    1 image files unchanged

 尝试了其他的命令行修改的方法也不行。只能从文件实际内容去修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1682684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

92.网络游戏逆向分析与漏洞攻防-游戏技能系统分析-利用哈希表实现快速读取文本内容

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

车间人员作业行为智能检测 AI视觉在生产车间制造中的应用

车间人员作业行为智能检测系统基于神经网络人工智能视觉算法&#xff0c;车间人员作业行为智能检测通过对车间监控摄像头获取的视频图像进行分析和识别&#xff0c;实现了对人员操作行为的智能检测。系统对工人的操作环节进行分解&#xff0c;根据时间、动作标准等方面制定了规…

Django5+React18前后端分离开发实战13 使用React创建前端项目

先将nodejs的版本切换到18&#xff1a; 接着&#xff0c;创建项目&#xff1a; npx create-react-app frontend接着&#xff0c;使用webstorm打开这个刚创建的项目&#xff1a; 添加一个npm run start的配置&#xff1a; 通过start启动服务&#xff1a; 浏览器访问&…

STranslate即开即用、即用即走的翻译(OCR)工具 v1.1.3.514

软件介绍 STranslate 是一款面向 Windows 操作系统用户设计的翻译软件&#xff0c;该软件具备开源性质并且免费。它结合了翻译功能与光学字符识别&#xff08;OCR&#xff09;技术&#xff0c;允许用户高效且直接地在屏幕上进行文字的翻译和识别。在开发过程中&#xff0c;STr…

Nginx/阿里云/二级域名的配置和使用

阿里云域名解析配置如下&#xff1a; nginx配置如下&#xff1a; 访问地址&#xff1a; zhadmin.iotzzh.com image.png

二叉搜索数之删除节点

看题目&#xff1a; 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可分为两个步…

详解ArcGIS 水文分析模型构建

目录 前言 项目环境、条件 Dem 数据预览 ArcGIS模型构建器 模型搭建 填洼 流向 流量 河流长度 栅格计算器 河流链接 河网分级 栅格河网矢量化 绘制倾泻点 栅格流域提取 集水区 盆域分析 栅格转面 模型应用 导出 py 文件 完善脚本 最终效果 结束语 前言 …

【NumPy】关于numpy.loadtxt()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

有没有适合女性做的副业?盘点9个适合女生做的赚钱兼职副业

亲爱的女神们&#xff0c;你们是否也想在忙碌的生活中寻找一些额外的乐趣和收入呢&#xff1f;今天&#xff0c;就为大家揭秘九种特别适合女性的副业&#xff0c;让你在追求美丽的同时&#xff0c;也能轻松赚取零花钱&#xff0c;秒变“小金库”&#xff01; 一、宅富社任务赚钱…

Default Folder X for Mac v6.0.7激活版:高效、智能的文件管理新选择

在快节奏的工作与生活中&#xff0c;高效管理文件已成为每个Mac用户的迫切需求。Default Folder X for Mac正是为了满足这一需求而生&#xff0c;它以其卓越的性能和丰富的功能&#xff0c;为Mac用户带来了前所未有的文件管理体验。 Default Folder X for Mac拥有直观易用的界面…

攻防世界---web---warmup

1、题目描述 2、查看源码&#xff0c;发现有个source.php 3、访问该文件&#xff0c;得到这一串代码 4、分析代码 5、访问hint.php&#xff0c;提示flag在ffffllllaaaagggg这个文件下 6、构造payload ?filesource.php?/../../../../../../ffffllllaaaagggg

Java基础之进制转换和位运算专题

什么是进制&#xff1f; 是数学中的一个概念&#xff0c;就是数据“逢几进位”。 例如&#xff1a;生活中用的计数方法 ---- 十进制。十进制就是数字逢十就要进一位。 例如&#xff1a;一个星期有7天&#xff0c;就是逢七进一&#xff1b;一个月有30天就是逢30进一&#xff1b;…

多尺度注意力机制突破性成果!低成本、高性能兼备

与传统的注意力机制相比&#xff0c;多尺度注意力机制引入了多个尺度的注意力权重&#xff0c;让模型能够更好地理解和处理复杂数据。 这种机制通过在不同尺度上捕捉输入数据的特征&#xff0c;让模型同时关注局部细节和全局结构&#xff0c;以提高对细节和上下文信息的理解&a…

【openlayers系统学习】3.5colormap详解(颜色映射)

五、colormap详解&#xff08;颜色映射&#xff09; ​colormap​ 包是一个很好的实用程序库&#xff0c;用于创建颜色图。该库已作为项目的依赖项添加&#xff08;1.7美化&#xff08;设置style&#xff09;&#xff09;。要导入它&#xff0c;请编辑 main.js​ 以包含以下行…

AWS安全性身份和合规性之Identity and Access Management(IAM)

通过AWS Identity and Access Management&#xff08;IAM&#xff09;&#xff0c;您可以指定谁或什么能够访问AWS中的服务和资源、集中管理精细权限&#xff0c;并分析访问权限以优化跨AWS的权限。 比如一家软件开发公司需要在AWS上创建多个开发人员账户&#xff0c;并对其进…

使用Python生成一束玫瑰花

520到了&#xff0c;没时间买花&#xff1f;我们来生成一个电子的。 Python不仅是一种强大的编程语言&#xff0c;用于开发应用程序和分析数据&#xff0c;它也可以用来创造美丽的艺术作品。在这篇博客中&#xff0c;我们将探索如何使用Python生成一束玫瑰花的图像。 准备工作…

绿联硬盘数据恢复方法:安全、高效找回珍贵数据

在数字化时代&#xff0c;硬盘承载着大量的个人和企业数据&#xff0c;一旦数据丢失或损坏&#xff0c;后果往往不堪设想。绿联硬盘以其稳定的性能和良好的口碑赢得了众多用户的信赖&#xff0c;但即便如此&#xff0c;数据恢复问题仍然是用户可能面临的一大挑战。本文将为您详…

【NOIP2013普及组复赛】题4:车站分级

题4&#xff1a;车站分级 【题目描述】 一条单向的铁路线上&#xff0c;依次有编号为 1 , 2 , … , n 1,2,…,n 1,2,…,n 的 n n n 个火车站。每个火车站都有一个级别&#xff0c;最低为 1 1 1 级。现有若干趟车次在这条线路上行驶&#xff0c;每一趟都满足如下要求&#…

Snowy2.x 版本使用 Yaml

代码&#xff1a;https://gitee.com/xiaonuobase/snowy/tree/Snowy2.5.2/ 直接将 properties 转换成 yaml 那么你大概率会遇到下面报错&#xff1a; 然后你上网搜索&#xff0c;发现是 snakeyaml 版本的问题&#xff0c;1.x 版本的 snakeyaml 有安全隐患&#xff0c;要升级到…

C语言程序的编译

目录 一、预处理&#xff08;预编译&#xff09; 二、编译 三、汇编 四&#xff0c;链接 在前面讲到了宏的定义&#xff0c;那么宏在编译时候是如何发生替换的&#xff1f;接下来做一下详细的介绍C语言程序的编译过程主要包括以下几个步骤&#xff1a;预处理、编译、汇编和…