首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python 修復損壞 JPEG 文件:基於文件頭特徵碼截取恢復

     編輯:更多程式設計知識

JPEG 文件損壞常見於傳輸中斷、磁盤錯誤、誤刪恢復等場景。本文提供一個**基於 JPEG 標準文件頭(SOI 標記 0xFFD8)定位並截取有效數據**的輕量修復腳本,適用於文件頭損壞但數據區基本完整的情況。

JPEG 文件結構基礎

  • SOI (Start of Image):0xFF 0xD8,文件必須以此兩字節開頭。
  • APP0/JFIF 標記:通常緊隨 SOI 之後,0xFF 0xE0...
  • DQT (Define Quantization Table):0xFF 0xDB,量化表數據。
  • 腳本採用特徵碼 FF D8 FF DB(SOI + DQT)作為**有效數據起始錨點**,假設損壞僅發生在文件開頭。

修復腳本

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys

def jpg_fix(filename):
    # JPEG 特徵碼:SOI (FFD8) + DQT (FFDB)
    signature = b'\xFF\xD8\xFF\xDB'
    
    with open(filename, 'rb') as f:
        # 跳過前 4 字節(假設原文件頭可能損壞)
        f.seek(len(signature))
        data = f.read()
    
    # 尋找特徵碼在數據中的位置
    pos = data.find(signature)
    if pos < 0:
        raise Exception('Not find JPEG signature (FFD8FFDB)')
    
    # 從特徵碼處截取至文件末尾
    valid_data = data[pos:]
    
    # 覆寫原文件(建議先備份!)
    with open(filename, 'wb') as f:
        f.write(valid_data)
    
    print(f'Fixed: {filename}, recovered size: {len(valid_data)} bytes')

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print("Usage: python jpg_fix.py ")
        sys.exit(1)
    
    for arg in sys.argv[1:]:
        try:
            jpg_fix(arg)
        except Exception as e:
            print(f"Failed to fix {arg}: {e}")

使用方法

  1. 保存為 jpg_fix.py。
  2. 務必先備份損壞文件!
  3. 命令行運行:
python jpg_fix.py damaged.jpg
# 批量修復
python jpg_fix.py *.jpg

適用場景與局限

適用不適用
文件開頭字節損壞/丟失,數據區完整數據區本身損壞、截斷、缺失
誤寫入文件頭垃圾數據非標準 JPEG 格式(如 RAW、PNG 偽裝)
恢復軟體恢復出的文件頭錯位高度碎片化、多段損壞

原理說明

  1. 以二進制模式 rb/wb 讀寫,避免文本模式修改換行符。
  2. 2. f.seek(4) 跳過原文件前 4 字節(若原文件頭完整則恰好跳過 SOI+DQT)。 3. data.find(signature) 定位第一個有效 JPEG 數據塊起始位置。 4. 截取 data[pos:] 並覆寫,構成合法 JPEG 文件。

進階改進方向

  • 支持多特徵碼嘗試(SOI+APP0 FFD8FFE0、SOI+DHT FFD8FFC4 等)。
  • 驗證修復後文件完整性:解碼嘗試(PIL.Image.open().verify())。
  • 輸出到新文件而非覆蓋,保留原始數據供多次嘗試。
  • 圖形界面/拖拽支持,降低使用門檻。

總結

「特徵碼定位 + 截取尾部」是修復文件頭損壞的經典思路,Python 幾十行代碼即可實現。**修復前務必備份,修復後驗證可打開**,不保證 100% 成功,但能挽回大量看似損壞的珍貴圖片。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved