jpg 파일을 열려고 할 때 "JPEG 파일이 아닙니다 : 0x89 0x50으로 시작합니다"라는 메시지가 나타나는 이유는 무엇입니까?
jpg 파일을 열려고 할 때 "JPEG 파일이 아닙니다 : 0x89 0x50으로 시작합니다"라는 메시지가 나타나는 이유는 무엇입니까?
답변:
파일은 실제로 파일 확장자가 잘못된 PNG입니다. "0x89 0x50"은 PNG 파일이 시작되는 방식입니다.
파일은 JPEG 파일이 아니며 도중에 PNG에서 JPEG로 이름이 변경되었습니다. 일부 프로그램은이를 인식 된 파일 확장자로 열고 접두사에서 유형을 유추하지만 분명히 사용중인 유형은 아닙니다.
* .jpg의 이름을 * .png로 변경하면됩니다. 또는 브라우저에서이 파일을 엽니 다.
이것은 libjpeg를 사용하여 jpeg 파일을 여는 JPEG 파일 뷰어를 사용하여 PNG 파일을 열려고 할 때 발생하는 오류 응답입니다. 이전 답변에서 언급했듯이 파일 이름이 png에서 JPEG로 변경됩니다.
다음은 디렉토리에서 결함 jpg 이미지를 식별하는 파이썬 스크립트입니다.
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")
다음은 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")