2021/07/07

Meg tudunk menteni egy JPEG-et?

Spoiler: nem teljesen. 

Van amikor semmi nem hajlandó kinyitni egy JPEG állományt. Sérülhet, vagy hiányozhat a fejléce, de akár maga az adat is. Kaptunk pár ilyen képet, hogy lám tudunk e kezdeni valamit velük. Feltehetőleg a  már a kártyára mentés során megtörtént a baj, aminek vagy a kártya, vagy a gép lehetett az oka. A konkrét fotókról nem lesznek screenek, mert valami családi, személyes fotókról van szó. Úgyhogy csak betűvel mutatom őket. 

A baloldali egy normális JPEG ugyanabból az alomból (ugyanaz a gép, beállítás, alkalom stb), a jobboldali meg a sérült, amire leginkább olyan jellegű hibaüzeneteket kapunk a képnézőktől, hogy a fejléc nem olvasható (ettől még hátrább is lehetnek gondok, mint az később ki is fog derülni). Egy JPEG fejléc kezdete FF D8, hát itt már az sincs meg. És persze a záró marker FF D9 sincs a file végén  De egyelőre a fejlécre koncentrálunk. 

Míg a hexeditor értelmezhető adatokat is láthat egy rendes JPEG-ben (például a gép típusát), a sérült file csak egy nagy kevert adathalmaz. Vannak olyan esetek, amikor a fejléc olvasható ugyan (a markerek legalább megvannak), de sérült, ilyenkor a kép megjelenítése megtörténik, de hibásan (glitches).

Mindenesetre érdemes az összes bevált képtweakelő alkalmazásunkkal tenni egy próbát. Nekünk ilyenek az Irfan, JPEGsnoop, ez utóbbi megengedte, hogy legalább a fejlécben levő thumbnailokat kimentsük, ehhez a nyitási hibaüzenetben felajánlja a Tools>Image search Forward lehetőséget, majd Export JPEG.  Ebben full HD felbontású thumbnail is volt, ez ki is elégítette a kárvallottat. De minket még nem.

A header cseréjéhez szükség van egy nagyon hasonló, de működő képre, ami lehetőleg ugyanazzal a géppel, ugyanolyan állásban, felbontásban stb. készült. Ilyen általában a netről is letölthető. Erre a típusra mi is találtunk. Sajnos a modern gépek custom adaptive kódolásai miatt szkeptikus vagyok ezzel a módszerrel, vagyis hogy ugyanaz a gép, két képen eltérő kvantálási mátrixokat fog használni - de ezt most nem fogjuk letesztelni, hogy valóban gondot okoz e. 

Forrás

A JPEG fejléce tehát a 0xFFD8 markerrel kezdődik és elvileg az adatok kezdetéig, vagyis a 0xFFDA markerig tart, aminek a vége a 0xFFD9 (EndOfImage). (Ezeket már használtuk a vízjeleknél.) A fileon belül thumbnailek lehetnek, ezért előfordulhat több FFDA FFD9 páros. A mi esetünkben két thumbnail is van (egy 160x120pixeles és egy 1920*1080 pixeles), ezért 3 darab FFDA markert találtunk, az első kettő közötti a legkisebb régió (itt sejtjük a kis thumbnailt), a második-harmadik között a leghosszabb, itt sejtjük a teljes felbontású képet, és az utolsó után sejtjük a közepes felbontású thumbnail. 

Ez a videóban végig vezet a fejátültetésen, de ő azt állítja, hogy a a legutolsó FFDA után van a képi információ maga, tehát ettől előfele mindent át kell átültetnünk a működő képről a döglöttre. Ez a mi esetünkben nem működött. 


Felül a hibás kép, alul a hibátlan keresési eredményében az látszik, hogy a hibás fileban kb. 2 Megabytnál van az első FF DA, a másikban meg 38 kbytenál. Bár a két file méretében van némi különbség (2,687Mb vs 3,031Mb) ez azért nem indokol ekkora eltérést. 

Kipróbáltuk mégis az összes variációt, pl. a középső FF DA előtti tartományt ültettük át, meg úgy is, hogy az első FF DA előtti tartományt. De még azt is, hogy a jó képből a középső FF DA előtti részt ráültettük a rossz kép első FF DA előtti szakaszára. Legjobb esetekben is Glitches, kevert képeket kaptunk, ami leginkább a donor kép tartalmára emlékeztetett, de néha nyomokban a hibás kép tartalmát is hordozták. 

Ekkor már az volt a gyanúnk, hogy a teljes kép úgy van összekutyulva, hogy csak na. Hogy a módszerben legalább biztosak lehessünk, kipróbáltuk két saját telefonos képpel. Egyiknek a fejlécébe beletöröltünk, hogy ne tudják megnyitni a képnézők. A donorról a file elejétől az utolsó FFDA-ig mindent átpakoltunk a sérült kép hasonló helyére. Prímán használhatóvá lett a file, és persze érdekesség, hogy a metaadatait is mind átvette a donornak, ami logikus.

Ezek után visszatértünk az eredeti problémához, és a hibás képben rákerestünk a filevég-jelre, amit valahol középtájt talált meg, és utána rögtön a file kezdete marker következett. Arra gondoltunk, hogy akkor innen hátrafelé mindent előre másolunk, hátha csak az eleje valahogy a végére került. A kép életre kelt ugyan, de csak a 1920*1080-as fileméretben nyílt meg, mintha a thumbnailt összetévesztette volna az igazi képi tartalommal. Itt még ki lehetett volna próbálni a thumbnailek és a kép sorrendjének minden változatát, de jobb ötletünk támadt. Nem a jó képből teszünk fejlécet a rossz képre, hanem a rossz kép adatfolyamát tesszuk a jó kép adatfolyamának a helyére.

Kikerestük a hibás képből a legbővebb FF DA - FF D9) részt, ezt tekintettük a képi info tényleges streamjének és ezt másoltuk bele a jó kép hasonló területére. Az eredmény egy teljes felbontású de durván glitches kép lett. Amit Jpeg Repair Shopban kicsit megpróbáltunk kipofozni (erről itt is találsz videót), de nem volt elég az MCU-kat tologatni, mert hiányzott a kép kb. 10 százaléka és a színjavítás sem volt tökéletes. Mondjuk azért a kép középső régiója igencsak jóra sikeredett. 

Még tettünk egy kört a a Jpeg Repair 2.8 programmal is, de hibás verzió lehetett, mert semmire se bírtuk rávenni. Bevált programok próbaverzióit meg azért nem töltjük le, mert azok csak preview mentését ígérik, azt meg már nekünk is sikerült, a thumbnail mentésével. Hát nincs heppiend. De eltelt egy nap hiába, vagyis pont azt tettük, amiről szól az élet.

Nincsenek megjegyzések:

Megjegyzés küldése