Jpgファイルを開こうとすると、「JPEGファイルではありません:0x89 0x50で始まる」というメッセージが表示されるのはなぜですか?
ファイルは実際には、間違ったファイル拡張子を持つPNGです。 「0x89 0x50」は、PNGファイルの開始方法です。
ファイルはJPEGファイルではなく、途中でPNGからJPEGに名前が変更されただけです。いくつかのプログラムはこれを認識されたファイル拡張子として開き、プレフィックスからタイプを推測しますが、明らかに使用しているものではありません。
Unixライクなプラットフォームでファイルの実際のタイプをチェックする簡単なパスを次に示します。
次のような「ファイル」コマンドを使用します。
file e3f8794a5c226d4.jpg
そして出力は
e3f8794a5c226d4.jpg: PNG image data, 3768 x 2640, 8-bit/color RGBA, non-interlaced
ファイル情報の詳細を出力し、指定されたファイルが破壊されているかどうかも確認できます。
* .jpgの名前を* .pngに変更するだけです。または、このファイルをブラウザで開きます
ディレクトリ内のこれらの障害jpgイメージを識別するためのpythonスクリプトです。
import glob
import os
import re
import logging
import traceback
filelist=glob.glob("/path/to/*.jpg")
for file_obj in filelist:
try:
jpg_str=os.popen("file \""+str(file_obj)+"\"").read()
if (re.search('PNG image data', jpg_str, re.IGNORECASE)) or (re.search('Png patch', jpg_str, re.IGNORECASE)):
print("Deleting jpg as it contains png encoding - "+str(file_obj))
os.system("rm \""+str(file_obj)+"\"")
except Exception as e:
logging.error(traceback.format_exc())
print("Cleaning jps done")
これは、libjpegを使用してjpegファイルを開くJPEGファイルビューアを使用してPNGファイルを開こうとしたときのエラー応答です。以前の回答で述べたように、ファイルの名前はpngからJPEGに変更されます。
これは、Mohitのスクリプトの修正バージョンです。誤った名前のファイルを削除する代わりに、非破壊的に名前を変更します。
また、os.system()呼び出しをサブプロセス呼び出しにスワップアウトし、ファイル名の引用符に関するエスケープの問題を解決します。
import glob
import subprocess
import os
import re
import logging
import traceback
filelist=glob.glob("/path/to/*.jpg")
for file_obj in filelist:
try:
jpg_str = subprocess.check_output(['file', file_obj]).decode()
if (re.search('PNG image data', jpg_str, re.IGNORECASE)) or (re.search('Png patch', jpg_str, re.IGNORECASE)):
old_path = os.path.splitext(file_obj)
if not os.path.isfile(old_path[0]+'.png'):
new_file = old_path[0]+'.png'
Elif not os.path.isfile(file_obj+'.png'):
new_file = file_obj+'.png'
else:
print("Found PNG hiding as JPEG but couldn't rename:", file_obj)
continue
print("Found PNG hiding as JPEG, renaming:", file_obj, '->', new_file)
subprocess.run(['mv', file_obj, new_file])
except Exception as e:
logging.error(traceback.format_exc())
print("Cleaning JPEGs done")