iPhone實況照片從Windows資源管理器復制的JPG+MOV無法正常還原到iPhone

背景:

之前使用的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 redef 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 Nonereturn stdout.strip()except FileNotFoundError:print("ExifTool is not installed or not found in the system path.")return Nonedef 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 = Nonefor item in exif_data:if b'Content Identifier' in item:content_identifier = item.split(b':')[-1].strip()breakassert content_identifier is not Noneassert 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 = Nonefor 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()breakassert media_group_uuid is not Noneassert 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_filesif __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.JPGDECIMAL       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.JPGDECIMAL       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.JPG0 image files updated1 image files unchanged

?嘗試了其他的命令行修改的方法也不行。只能從文件實際內容去修改。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13565.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13565.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13565.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java18新特性

Java 18引入了若干新特性&#xff0c;以增強語言的功能性和性能。具體如下&#xff1a; 服務提供者接口&#xff08;Service Provider Interfaces, SPI&#xff09;&#xff1a;允許開發者為Java模塊系統定義服務加載機制&#xff0c;從而能夠更靈活地發現和加載服務實現。簡單…

supOS NEO科技普惠!永久免費!億元補貼

數字化轉型正在全球蓬勃發展&#xff0c;工業操作系統進入大規模推廣期&#xff01; 如果您正在被預算不足、技術團隊不強、數字化投入產出比等問題困擾&#xff0c;supOS NEO是您最好的選擇。 “讓supOS走進萬千工廠、千行百業&#xff01;讓全世界每個工廠都能用得上supOS&am…

MM模塊學習三 (創建采購申請)

采購信息記錄比較特殊既是主數據又是貨源 注&#xff1a;發票校驗是指把供應商提供的發票做到系統里面產生一張應付憑證。 1.決定采購需求 采購需求可以手工創建&#xff08;ME51N&#xff09;&#xff0c;也可以自動產生&#xff08;比如&#xff1a;MRP&#xff0c;以及比如…

Java——內部類

1.什么是內部類 在一個類的里面再定義一個類&#xff0c;新定義的這個類就是內部類 舉例&#xff1a;在Outer類的里面定義一個Inter類 class Outer{class Inter{} } 在這里Outer叫外部類&#xff0c;Inter叫內部類 內部類的應用場景 定義一個汽車類&#xff1a; 屬性&#xf…

CTFshow之文件上傳web入門151關-161關解密。包教包會!!!!

這段時間一直在搞文件上傳相關的知識&#xff0c;正好把ctf的題目做做寫寫給自字做個總結&#xff01; 不過有一個確定就是所有的測試全部是黑盒測試&#xff0c;無法從代碼層面和大家解釋&#xff0c;我找個時間把upload-labs靶場做一做給大家講講白盒的代碼審計 一、實驗準…

2024-5-23 石群電路-14

2024-5-23&#xff0c;星期四&#xff0c;22:20&#xff0c;天氣&#xff1a;晴&#xff0c;心情&#xff1a;晴。今天沒有什么重要的事情發生&#xff0c;心情一如既往的平靜&#xff0c;距離返校假期還有兩天~~~。 今天觀看了石群老師電路基礎課程的第23/24個視頻&#xff0…

Flutter 中的 AnimatedThere 小部件:全面指南

Flutter 中的 AnimatedThere 小部件&#xff1a;全面指南 在Flutter中&#xff0c;動畫是增強用戶體驗的強大工具。雖然Flutter沒有一個名為AnimatedThere的官方小部件&#xff0c;但我們可以根據常見的動畫模式來構建一個類似的自定義動畫效果。本文將指導您如何使用Flutter的…

Python 安裝 ONNX Runtime (ORT)

1. Python 安裝 ONNX Runtime 安裝cpu版的 onnx runtime&#xff1a; pip install onnxruntime 安裝gpu版的 onnx runtime&#xff08;cuda 11.x&#xff09;&#xff1a;(默認安裝適用于cuda 11.8 的onnx runtime) pip install onnxruntime-gpu 安裝gpu版的 onnx runtime…

真實案例分享,終端pc直接telnet不到出口路由器。

1、背景信息 我終端pc的網卡地址獲取的網關是在核心交換機上&#xff0c;在核心交換機上telnet出口路由器可以實現。 所有終端網段都不能telnet出口路由器&#xff0c;客戶希望能用最小的影響方式進行解決。 2、現有配置信息 終端的無線和有線分別在兩個網段中&#xff0c;…

【課后練習分享】Java用戶注冊界面設計和求三角形面積的圖形界面程序

目錄 java編程題&#xff08;每日一練&#xff09;&#xff1a; 問題一的答案代碼如下&#xff1a; 問題一的運行截圖如下&#xff1a; 問題二的答案代碼如下&#xff1a; 問題二的運行截圖如下&#xff1a; java編程題&#xff08;每日一練&#xff09;&#xff1a; 1.…

大數據量MySQL的分頁查詢優化

目錄 造數據查看耗時優化方案總結 造數據 我用MySQL存儲過程生成了100多萬條數據&#xff0c;存儲過程如下。 DELIMITER $$ USE test$$ DROP PROCEDURE IF EXISTS proc_user$$CREATE PROCEDURE proc_user() BEGINDECLARE i INT DEFAULT 1;WHILE i < 1000000 DOINSERT INT…

【安裝筆記(目錄)】

安裝筆記-系列文章目錄 第一章 Windows 工具 [1001] Optimizer &#xff1a;一款高級配置實用工具&#xff0c;旨在增強你在Windows上的隱私和安全性。 [1002] WSL2&#xff1a;適用于 Linux 的 Windows 子系統 (WSL) 可讓開發人員直接在 Windows 上按原樣運行 GNU/Linux 環境…

力扣226.翻轉二叉樹101.對稱二叉樹

解決二叉樹的問題&#xff0c;經常要習慣從遞歸角度思考 左子樹/右子樹是否具備某屬性、是否屬于什么類型&#xff08;和題目要求的判斷當前樹是否xxx一樣&#xff09;&#xff1b; 對左/右子樹進行什么操作&#xff08;和題目要求的對當前樹的操作一樣&#xff09;。 226.翻轉…

提權方式及原理匯總

一、Linux提權 1、SUID提權 SUID&#xff08;設置用戶ID&#xff09;是賦予文件的一種權限&#xff0c;它會出現在文件擁有者權限的執行位上&#xff0c;具有這種權限的文件會在其執行時&#xff0c;使調用者暫時獲得該文件擁有者的權限。 為可執行文件添加suid權限的目的是簡…

解決SpringBoot使用@Transactional進行RestTemplate遠程調用導致查詢數據記錄為null的bug

開啟事務過程中&#xff0c;如果遠程調用查詢當前已經開啟但沒有提交的事務&#xff0c;就會查不到數據。 示例代碼 import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.transaction.annotation.Transactional; import o…

二叉樹求解大小操作詳解

目錄 一、求所有結點個數 1.1 遞歸思路 1.2 遞歸分支圖 1.3 遞歸棧幀圖 1.4 C語言實現 二、求葉子結點個數 2.1 遞歸思路 2.2 遞歸分支圖 2.3 遞歸棧幀圖 2.4 C語言實現 三、求第K層的結點個數 3.1 遞歸思路 3.2 遞歸分支圖 3.3 遞歸棧幀圖 3.4 C語言實現 四、求…

【python】使用函數名而不加括號是什么情況?

使用函數名而不加括號通常是為了表示對函數本身的引用&#xff0c;而不是調用函數。這種用法通常出現在下面這幾種情況&#xff1a; 作為回調函數傳遞&#xff1a;將函數名作為參數傳遞給其他函數&#xff0c;以便在需要時調用該函數。例如&#xff0c;在事件處理程序或高階函數…

馮喜運:5.24現貨黃金趨勢解讀,黃金原油行情分析及操作建議

【黃金消息面分析】&#xff1a;美國勞工部公布的最新數據顯示&#xff0c;截至5月18日的一周內&#xff0c;首次申請失業救濟人數下降至21.5萬人&#xff0c;創下自去年9月以來的最大降幅。數據公布后&#xff0c;現貨黃金短線下挫6美元&#xff0c;報2362.71美元/盎司。這表明…

2024受歡迎的便簽app是哪個

在繁忙的工作和生活中&#xff0c;便簽app成為了我們不可或缺的小助手。2024年&#xff0c;隨著人們對高效工作和生活品質的追求&#xff0c;選擇一款功能強大且用戶友好的便簽app顯得尤為重要。在眾多選擇中&#xff0c;敬業簽以其出色的記錄與提醒功能&#xff0c;脫穎而出&a…

前端發版如何告知用戶

在具體項目場景中&#xff0c;前端發版后&#xff0c;用戶不手動刷新&#xff0c;則感知不到更新&#xff1b;經常會出現&#xff1a;前端更新了某個功能&#xff0c;導致舊功能使用出現問題&#xff0c;而被用戶提單&#xff1b; 關于這個問題有多種解決方式&#xff1a; We…