Egy kisméretű képfájl megnyitásakor jóval több memóriát használhat, mint amennyit a fájl a meghajtón foglal. A szerkesztéshez előállított képpontadat méretét a szélesség, a magasság, a csatornák száma és a csatornánkénti bitmélység határozza meg. A tömörített fájl hossza további tényezőktől függ, ezért a kettőt külön számold.
A képpontadat alapképlete
Nyers bájtszám = szélesség × magasság × csatornák száma × bitmélység / 8.
A szélesség és a magasság pixelben értendő. A bitmélység itt egyetlen csatornára vonatkozik. Egy 8 bites RGB kép három csatornája összesen 24 bitet, vagyis 3 bájtot jelent pixelenként. Egy külön áttetszőségi, azaz alfa-csatornával négy csatorna és 4 bájt adódik.
A W3C PNG specifikációja megkülönbözteti a színmintákat, a mintánkénti bitmélységet és az alfa-csatornát. A böngészőben gyakori, csatornánként 8 bites RGBA képpontadatot az MDN ImageData dokumentációja is leírja. A számítás a képpontok adatára vonatkozik; az alkalmazás teljes memóriaigénye ezen felül alakul.
Szemléltető példa: 4 000 × 3 000 pixel
A képpontok száma 4 000 × 3 000 = 12 000 000, vagyis 12 megapixel. Három, egyenként 8 bites csatornával:
12 000 000 × 3 × 8 / 8 = 36 000 000 bájt.
Ez 36 MB, bináris egységben 36 000 000 / 1 048 576 = 34,33 MiB. A két kijelzés ugyanazt az adatmennyiséget írja le eltérő egységben; az adatmennyiség-átváltóban ellenőrizheted.
| Képpontadat | Bájt/pixel | Nyers méret |
|---|---|---|
| RGB, 8 bit/csatorna | 3 | 36 MB |
| RGBA, 8 bit/csatorna | 4 | 48 MB |
| RGB, 16 bit/csatorna | 6 | 72 MB |
A 16 bites csatornák ebben a példában kétszer annyi bájtot igényelnek, mint a 8 bitesek. A „16 bites kép” megnevezés önmagában ezért pontatlan lehet: ellenőrizd, hogy csatornánkénti vagy összesített mélységről beszélnek.
Mindkét oldal felezése negyedannyi pixelt ad
Ha a képet 2 000 × 1 500 pixelre méretezed, a pixelszám 3 000 000-re csökken. Változatlan, 8 bites RGB tárolással ez 9 000 000 bájt, az eredeti 36 MB negyede.
A különbség azért ekkora, mert a két méret egymással szorzódik: 0,5 × 0,5 = 0,25. Ha csak a szélességet feleznéd változatlan magasság mellett, a pixelszám a felére csökkenne, közben a képarány is módosulna. Átméretezés előtt ezért a kívánt pixelméretet és a képarány megőrzését együtt határozd meg.
Miért nem jósolható meg ebből a JPEG vagy PNG mérete?
A tömörítés kihasználhatja a képtartalom ismétlődéseit, és veszteséges formátumnál a megőrzött részletek mennyisége is beállítható. Két azonos pixelméretű kép eltérő tartalommal eltérő méretű fájlt adhat. A PNG például veszteségmentes tömörítést használ; ez nem garantál minden képre azonos tömörítési arányt.
A képfájlméret-becslő egy kézzel megadott aránnyal is számol. Ha szemléltetésként 10:1 nyers/tömörített arányt feltételezünk, akkor 36 MB / 10 = 3,6 MB becsült adatméret. Ez a feltevés eredménye. A tényleges exportot mentsd el, és annak méretét mérd meg.
Hány kép dolgozható fel egyszerre?
Vegyünk egy feltételezett 512 MiB-os feldolgozási keretet. Ebből más adatok számára 64 MiB-ot tartunk fenn, és képenként két teljes, 4 000 × 3 000 pixeles, 8 bites RGBA-példánnyal számolunk. Egy kép két példánya 2 × 48 000 000 = 96 000 000 bájt.
A képfeldolgozásra maradó keret (512 − 64) × 1 048 576 = 469 762 048 bájt. A párhuzamos feladatok száma így lefelé kerekítés(469 762 048 / 96 000 000) = 4.
| Egyidejű képek | Két képpéldány feladatonként és 64 MiB egyéb keret | Belefér 512 MiB-ba? |
|---|---|---|
| 4 | 451 108 864 bájt | Igen |
| 5 | 547 108 864 bájt | Nem |
Az 512 MiB összesen 536 870 912 bájt, ezért az ötödik feladat már ebben az egyszerű modellben sem fér el. A négyes korlát akkor használható, ha a két képpéldány és a külön fenntartott rész valóban lefedi a csúcsigényt. Dekódolási átmeneti memória vagy további réteg ezt módosíthatja.
A saját folyamatodnál először egyetlen képfeldolgozás legnagyobb memóriahasználatát mérd meg, majd ezzel számold újra a párhuzamosságot. A fájl lemezen mért méretéből erre a keretre nem lehet következtetni: itt a feldolgozás közbeni, egyszerre élő képadatok számítanak.
Eltérő méretű képeknél a négyes darabkorlátot ne vidd tovább változatlanul. Az éppen feldolgozott képek külön becsült csúcsigényét add össze, és ehhez számold hozzá az egyszer fenntartott közös keretet. Új feladat akkor indulhat a választott modellben, ha vele együtt is marad elegendő hely. A becslést a ténylegesen fogadott legnagyobb pixelmérettel, bitmélységgel és műveletsorral ellenőrizd; egy kicsi próbakép mérése nem igazolja a nagyobb feladatok keretét.
Egybites PNG-képnél a sorvégi bitek is helyet foglalnak
A fenti RGB- és RGBA-példák egész bájtokban tárolt csatornákkal számolnak. Egy bitenként csomagolt, 1 001 × 1 000 pixeles, egybites szürkeárnyalatos, nem váltottsoros PNG-képnél további lépés kell. A PNG sorábrázolási szabálya szerint az egy sorhoz tartozó minták bájtokba kerülnek; a következő sor új bájton kezdődik.
Egy sor felfelé kerekítés(1 001 / 8) = 126 bájt. Az ezer sor így 126 000 bájt képpontadat. Az összes bit egyszeri elosztása nyolccal 125 125 bájtot adna, ami 875 bájttal kevesebb, mert a sorvégek kihasználatlan bitjeit elhagyná. A szűrőjelölés, a tömörítés és a fájl többi része ezen felül alakítja a PNG tényleges méretét.
Ugyanez a kép 8 bit/csatornás RGBA-pufferként 1 001 × 1 000 × 4 = 4 004 000 bájt. A bitenként csomagolt fájladat mérete ezért nem azonos a szerkesztéshez választott reprezentáció méretével. Ahol az alkalmazás külön sorhosszt vagy sorigazítást használ, a tényleges sorhossz és a magasság szorzatát vedd alapul.
Nulla vagy negatív méretből nem készíthető ilyen kép. Nagy állománynál a ténylegesen dekódolt formátumot és a folyamat mért csúcsigényét ellenőrizd, mielőtt párhuzamos feladatokat indítasz.
Záró tudáspróba
Kérdésenként egy választ jelölj meg, majd a megoldások alapján pontozd magad. Ez a három kérdés a cikkben bemutatott összefüggéseket ellenőrzi.
1. Mennyi képpontadat kell a 4 000 × 3 000 pixeles, 8 bit/csatornás RGBA képhez?
- A) 12 000 000 bájt.
- B) 36 000 000 bájt.
- C) 48 000 000 bájt.
2. 512 MiB keretből 64 MiB közös helyet fenntartasz, egy feladat pedig két 48 000 000 bájtos képpéldányt tart. Hány egyforma feladat fér a modellbe?
- A) Négy.
- B) Nyolc.
- C) Öt.
3. Egy 1 001 pixel széles, egybites PNG ezer sorát bájthatáron kezdjük. Mennyi a csomagolt képpontadat a szűrőjelölések nélkül?
- A) 4 004 000 bájt.
- B) 125 125 bájt.
- C) 126 000 bájt.
Megoldások és pontozás
1. C. A 12 millió pixel mindegyikéhez négy egybájtos csatorna tartozik: 12 000 000 × 4 = 48 000 000 bájt. Ismétléshez: Szemléltető példa: 4 000 × 3 000 pixel.
2. A. A 469 762 048 bájt maradékot feladatonként 96 000 000-rel osztva lefelé kerekítünk. Az ötödik feladattal már 547 108 864 bájt kellene. Ismétléshez: Hány kép dolgozható fel egyszerre?.
3. C. Minden sorhoz külön felfelé kell kerekíteni: 1 001/8 → 126 bájt. Ezer sor 126 000 bájt; az RGBA-puffer más reprezentáció. Ismétléshez: Egybites PNG-képnél a sorvégi bitek is helyet foglalnak.
Minden helyes válasz 1 pont; a hibás vagy kihagyott válasz 0 pont. Az összpontszám 0–3 lehet.
- 0 pont: dolgozd végig újra a három megoldásban megjelölt részt, és írd le a példák kiinduló feltételeit.
- 1 pont: a két elhibázott kérdésnél vezesd le a helyes választ; külön írd mellé, melyik feltétel vagy számolási lépés maradt ki.
- 2 pont: térj vissza az egyetlen elhibázott kérdéshez kapcsolt részhez, majd egy bemenet megváltoztatásával ellenőrizd újra az eredményt.
- 3 pont: a három összefüggést ebben a feladatsorban helyesen alkalmaztad. Próbáld ki a cikk egyik ellenőrzését saját adatokkal, a feltételeket és a mértékegységeket is feljegyezve.