Dlaczego pojawia się błąd: „To nie jest plik JPEG: zaczyna się od 0x89 0x50” [zamknięty]

Odpowiedzi:

100

Plik jest w rzeczywistości plikiem PNG z niewłaściwym rozszerzeniem. „0x89 0x50” to sposób uruchamiania pliku PNG.

matowe oparzenia
źródło
Zrobiłem zrzut ekranu na moim iPhonie 7 z iOS 12.0.1, a następnie ze Zdjęć udostępnionych na Dysku Google. Użyto domyślnej / sugerowanej nazwy podczas zapisywania i wystąpił ten błąd podczas próby otwarcia w systemie Ubuntu za pomocą przeglądarki obrazów. Po przeczytaniu tej odpowiedzi zmieniłem rozszerzenie na PNG i plik został otwarty bez konwertowania lub ponownego zapisywania w innym programie.
Brent Self
Dziękuję za odpowiedź. Od czego zaczyna się plik JPEG ?
maddypie
60

Twój plik nie jest plikiem JPEG, po prostu zmieniono jego nazwę z PNG na JPEG gdzieś po drodze. Niektóre programy otwierają to jako rozpoznawane rozszerzenie pliku i wywnioskują typ z prefiksu, ale oczywiście nie ten, którego używasz.

David M.
źródło
2
Jeśli chcesz znaleźć te pliki, możesz użyć tego linku StackOverflow: stackoverflow.com/questions/30684796/ ...
zygzak
9

po prostu zmień nazwę * .jpg na * .png. Lub otwórz ten plik w przeglądarce

user9015721
źródło
7

Oto szybkie przejście do sprawdzenia rzeczywistego typu pliku na platformie uniksowej:

używając polecenia „plik”, na przykład:

file e3f8794a5c226d4.jpg 

i wyjście jest

e3f8794a5c226d4.jpg: PNG image data, 3768 x 2640, 8-bit/color RGBA, non-interlaced

który wypisze szczegółowe informacje o pliku, a także może sprawdzić, czy określony plik został zniszczony.

Liu Hao
źródło
2

To jest odpowiedź o błędzie podczas próby otwarcia pliku PNG za pomocą przeglądarki plików JPEG, która używa biblioteki libjpeg do otwierania plików jpeg. Nazwa twojego pliku została zmieniona z png na JPEG, jak wspomniano we wcześniejszych odpowiedziach.

saurabheights
źródło
1

Oto skrypt w języku Python do identyfikacji tych obrazów jpg błędów w katalogu.

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 Arvind khakharia
źródło
1

Oto zmodyfikowana wersja skryptu Mohita. Zamiast usuwać pliki o błędnych nazwach, w sposób nieniszczący zmienia ich nazwy.

Wymienia również wywołania os.system () dla wywołań podprocesów, co rozwiązuje problemy związane ze znakami cudzysłowu w nazwach plików.

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")
Różne55
źródło
1
Dodając do odpowiedzi Different55. Skrypt działa tylko z Pythonem w wersji 3.5 i nowszych.
Ashwin