Itt egy turn ..., maks él

Egyszer találtam egy mágikus bugot, amelynek okát nem tudtam majdnem egy hónapig megtalálni. Igen, van valami oka, nem is reprodukálható. Az ügyfél folyamatosan kifogásolta, hogy a képek helytelenül vannak vágva, de még mindig kiszámíthatatlanul megfordulnak ...







A lényege az volt, hogy a felhasználók képeket feltölteni, az őket kísérő a novellákat, majd a moderátorok a tartalom ellenőrzését érintő témakörök erőforrás vágott képeket a kívánt képarányt és közzéteszi ezeket a történeteket.

A projekt termelésének első napjaitól szó szerint a moderátorok panaszai megérkeztek. Panaszkodott, hogy a képek nem várt módon vágódnak le, néha fekete sávok jelennek meg, néha a képek hirtelen megfordulnak, néha a vágás után nincs változás.

A képek kivágásához a django-image-crop könyvtárat használtuk. amely lehetővé teszi a jango adminisztrátor számára a jcuery plug-in Jcrop használatával történő vágást.

Mivel a hibát semmilyen módon nem lehetett reprodukálni, elkezdték hinni, hogy az ok le van rejtve valahol az ügyfél részében. Két és fél héten belül a hibák keresése során a böngészők és az operációs rendszerek egy kicsit kevesebb, mint az összes kombinációját tesztelték, beleértve a böngészők elavult verzióit is. De a hibát nem lehetett reprodukálni.

Ennek ellenére a különböző böngészőkben végzett képminőség szigorú tesztelése egyidejű hibát tár fel. A böngészőből, egyébként független. A kiszolgálót nagyszámú látogató számára optimalizálták. Maga a projekt regenerált, statikus hely volt, melyet nginx tárolt; egy kis api a történetek hozzáadásához és megkereséséhez; és egy adminisztratív interfész a történetek előtti mérséklésére és a statikus tartalom regenerálására.

Úgy történt, hogy nginx túl nehéz megbirkózni caching, és elég gyakran a vágás után az admin mutatják régi (nem vágjuk), amely után a moderátor újra és újra vágni a képet, és ennek eredményeként az eredeti kép van vágva a létező koordinátákat. Ennek megfelelően a kimenet fekete, csíkokkal áttörött kép volt, és a gyorsítótár frissítése észrevehetővé vált.

Ennek következtében eltűnt a régi kép megjelenítését követő vágás problémája. Az admin panelben megjelenik a következő html képkód:

A hibát megtalálta és megszüntette. A többet nem szabad megismételni. Győzheti a győzelmet.

Szó szerint egy héttel a termelés megváltozása után a moderátorok ismét megkaptak egy panaszt a kép helytelen termesztéséről. Szerencsére ezúttal kifejezetten jelezték, hogy melyik képen a rossz termést reprodukálták, és e-mailben elküldte a képet.

A levél megnyitása után megnyitottam egy új lapot, és elmentettem. Elkezdtem tesztelni a csavargóban e - a hiba nem reprodukálódik, szükség szerint vágja a képet, semmi sem fordul meg, a fekete sávok nem jelennek meg. Ugyanazt a képet ellenőriztem a gyártókiszolgálón - nem játszik. A trükk az volt, hogy le kellett tölteni a képet. de nem mentve a levéltől. Miután megkapta az eredeti képet, a hibát rendszeresen reprodukálták.

Grafikus képek esetén további metaadatok elmenthetők EXIF ​​formátumban. Ahol többek között a kép tájolásáról is tájékozódhat. Miután levontam a fájl exif-jét, azonnal világossá vált, hogy miért reprodukálják a hibát.

Az Exif Orientation címke leírja a kép tájolását a megjelenítéskor, az 1-től 8-ig terjedő értékek használatával:

Nyilvánvaló, hogy egy fényképezőgép példájával négy lehetőség van a tájékozódási címkéhez:

Amikor PIL-sel ment egy képet, az összes exif metaadat törlődik, így a mentett kép metainformáció nélkül nem kerül forgatásra, de így marad. Tehát a felhasználó szemszögéből nézve - kiszámíthatatlanul megfordulnak.

Mivel a PIL törli a metainformációt egy kép mentésekor, a képet a saját orientációs címke segítségével elforgatjuk.







Ez a funkció ellenőrzi a kép elforgatásával kapcsolatos információk jelenlétét, és ha jelen van, a képet megfelelő szögben elforgatja. A kép tárolásával a metainformáció törlődik, ezért még akkor is, ha az exif orientációs címke nem volt kameracímke (3, 6, 8), de tükröződött (2, 4, 5, 7). Ez a kép olyan lesz, mint amilyen valójában, és ha szükséges, a moderátorok képesek lesznek arra, hogy szükségüket változtassák.

Egy ilyen egyszerű feladat megoldotta ezt az elhanyagolt hibát.

A nagyobb tisztaság érdekében példát mutatunk a helytelen feldolgozásra a gyorsítótárazás miatt, valamint az exif irányultságú és anélkül eltérő képi viselkedésekkel. Az eredeti képként a híres Lena-t használjuk. de sokkal láthatóbb változások esetén a kanonikus verziója nem 512x512, hanem négyszögletes kép. Az exif információkkal való együttműködéshez használja az exiftool konzol segédprogramot.

Vegyünk egy portré-orientált képet, és próbáljuk meg kétszer vágni ugyanazon előnézeti képen.

Itt egy turn ..., maks él

A moderátor vágja le a képet, majd az oldal frissítése után ugyanazt az előnézetet újra betöltődik. A moderátor második alkalommal vágja el a képet, ugyanakkor úgy gondolja, hogy a változtatások valamilyen oknál fogva nem maradtak fenn.

Itt egy turn ..., maks él

De a valóságban a kép első alkalommal vágott ki helyesen.

Itt egy turn ..., maks él

Miután ismételt koordinátákat kapott a kép kivágásához, a következő történik.

Itt egy turn ..., maks él

És így tovább, minden későbbi vágáskor az eredeti képet továbbra is aprítani fogják. Ezért a véletlenszerű GET paraméter lehetővé teszi, hogy megbirkózzon a gyorsítótárral, és betölti a szükséges előnézeteket a helyes képfeldolgozáshoz.

Létre kell hoznunk az eredeti képet, a tájkép arányával, az adott orientációs címke nélkül.

Itt egy turn ..., maks él

A meta információkat jelenítjük meg a képen.

Másolja a képet és állítsa be a tájolási címkét 6.

Itt egy turn ..., maks él
A körforgás megtekintéséhez nyissa meg a képet egy új lapon.

Most nézzük meg, hogy milyen metainformáció van ebben a képben.

Amint látja, a tájoláscímke 90 CW forgatásra van állítva.

Képadatok feltöltése a szolgáltatásba - különböző viselkedést láthat:

A tájolás nélküli címke nélküli kép nem fordul el, és a kijelzőn megjelenik. tájképaránnyal.

Itt egy turn ..., maks él

A megjelenített tájolású címkéjű képet portré arányra forgatja.

Itt egy turn ..., maks él

A második kép úgy néz ki, ahogy kellene, és a moderátor minden kétség nélkül levágja a képet.

Itt egy turn ..., maks él

A kép fentiek szerinti ábrázolása szerint a moderátor elvárja a következő eredmény elérését.

Itt egy turn ..., maks él

Mivel azonban a koordináták portré tájolásra vannak állítva, és maga a kép tájképmérettel rendelkezik, az eredmény váratlan. A kép forog és fekete sáv jelenik meg a kép alján.

Itt egy turn ..., maks él

A kép előzetes elforgatásával és a metaadatok törlésével ez a váratlan viselkedés eltűnik, a kép megjelenik, ahogy valójában. A kép feltöltése a tájékozódási címkével, amikor elmenti a szerverre, azonnal el van forgatva.

Ha a moderátor levágja az álló képet.

Itt egy turn ..., maks él

Itt egy turn ..., maks él

Megkapja a megfelelő portré eredményt.

Itt egy turn ..., maks él