Valószínűleg tényleg az lehet, hogy nem teljesen fekete az a háttér, hanem valahol két EP szín között van, erre nem gondoltam.
Köszi a magyarázatot, István! Érthető és eléggé részletes is.
A pixelek színeltérését az EP128pal háromféle módon számolja, ezeket ki lehet kiválasztani. Az általad leírt képletekhez hasonlóan ezek vannak:
- egyszerű: Abs(R1-R0)+Abs(G1-G0)+Abs(B1-B0)
- súlyozott: Abs(R1-R0)*3+Abs(G1-G0)*4+Abs(B1-B0)*2
- exponenciális: (R1-R0)^2+(G1-G0)^2+(B1-B0)^2 <- ez ugyanaz, amit te is használsz
Érzetre valahogy a súlyozott lett a legjobb. Abból indultam ki, hogy a zöld a legfényesebb szín, aztán a piros, a kék pedig a legsötétebb. Ezért ha pl. a zöld eltér, azt jobban észrevenni, ezért azt súlyozza és számításkor nagyobb hibának veszi. Ha a kék tér el ugyanannyi árnyalatot, azt kevésbé lehet érezni.
Az EP128pal előbb az összes palettát megcsinálja minden sorra (vagy blokkra) egyszerre, csak utána készíti el a képet. A tiéd jobb megoldás, mert a következő sorhoz már a dithering után korrigált pixelekhez válogatja ki a színeket. Mondjuk ez csak soronkénti palettához lehet hatékony, ha nagyobb méretű blokkok vannak (pl. szabvány EXOS videolapok) egy palettához, akkor már nem. Az én programom az elején nem támogatta a soronkénti palettát, azért lett ilyen a feldolgozás sorrendje, aztán később eszembe se jutott.
Azt néztem, hogy attribútum módban mindkét attribútumnál végigpörgeted a 16 színt, aztán a legkisebb hibát adó színeket választod ki. Kipróbáltam, de nem értettem, mihez képest számítja a hibát.
Ha pixelenként néztem a 8 pixeles cellában, akkor olyan színeket választott ki, ami a legközelebb esik az eredeti színhez, ezért a dithering hatása nagyon lecsökkent, szinte mintha ki lett volna kapcsolva. Ha pedig a 8 pixelt együtt számoltam, akkor változatosabb színeket talált, de sokszor két teljesen oda nem illő szín különbsége adta a legkisebb hibát, így meglehetősen fura képeket konvertált. Végül hagytam a csudába és az lett a módszer, hogy a 8 pixelből két nagyon eltérő színt választott ki, a dithering rutin pedig majd megoldja. Ha az egyik szín sokszor szerepel, akkor azt mindenképp kiválasztja, a második színnél pedig annyit figyelt, hogy lehetőleg 1 pixelnél több helyen is előforduljon. Úgyhogy lenne még hová fejlődni, lehetne csiszolni rajta, de max. annyit érnék el vele, hogy talán megközelítené az epimgconv minőségét, de az már létezik és jó is, akkor meg minek.