Előfeltétel, hogy legalább két háttérszínnel ki tudjad menteni a diagramot (fehér és fekete).
Meghökkentő az a tény, hogy 2013-ban nincs egy olyan normális UML szerkesztő, ami átlátszó háttérrel ki tudná menteni a diagramot. Több hétig leveleztem egy Microsoft-os emberrel, hogy hogyan lehet olyan Visual Studio plugint írni, amivel lecserélem azt a k*baszott háttérszínt. Nem jutottunk semmire. Ugyanez az Enterprise Architect-el is, csak az még watermarkot is berak (éljen).
Úgy döntöttem, hogy elkerülendő a további szopást kidolgozok egy módszert, amivel legalább az említett feltétel mellett kihozható az eredeti szín és alfa. Nem újkeletű egyébként a dolog, a GIMP pl. tud ilyen color to alpha cuccost, de nem igazán felel meg a célnak.
Na de mi a probléma, és miért pont fekete és fehér kell legyen a háttér? Nézzük meg először is hogyan működik az alpha blending:
(A, B, C) * (1 - a) + (x, y, z) * a = (r1, g1, b1)
Ahol (r1, g,1, b1) az ismert kép, (A, B, C) pedig a szintén ismert háttér. Meghatározandó (x, y, z, a). Világos, hogy az egyenletrendszer alulhatározott, kellene még legalább egy egyenlet. Az egyszerűség kedvéért legyen ugyanez csak más háttérrel:
(D, E, F) * (1 - a) + (x, y, z) * a = (r2, g2, b2)
Vadul kivonva a felsőből az alsót:
(A-D, B-E, C-F) * (1 - a) = (r1-r2, g1-g2, b1-b2)
És itt kezdődnek a problémák...ugyanis az alfára most kaptunk egy túlhatározott rendszert, ráadásul vannak olyan esetek, amikor mindhárom alfa különböző. Azonban néhány észrevételt lehet tenni:
- ha (r1, g1, b1) == (r2, g2, b2), akkor a = 1 és készen vagyunk
- ha (r1, g1, b1) - (r2, g2, b2) == (A - D, B - E, C - F), akkor a = 0 és mindegy mi a szín
A második észrevétel megindokolja, hogy miért célszerű fehéret és feketét választani háttérnek. Ugyanis ha más választanánk, akkor egyéb színekkel is előállhat az egyenlőség, és akkor nem mondható meg 100%-al, hogy az mindkettőben a háttér. Sőt, az nem elég, ha ellenőrzöl a háttérszínre, ugyanis:
a = ((A - D) - (r1 - r2)) / (A - D)
illetve
x = (r1 - A * (1 - a)) / a
tehát x olyan színekre is szingularitásba kerülhetne, amik nem a háttérszínek. Feltehető tehát, hogy (A, B, C) = (255, 255, 255) és (D, E, F) = (0, 0, 0). Ekkor egy picit egyszerűsödik a dolog:
(x, y, z) * a = (r1, g1, b1)
(255, 255, 255) * (1 - a) + (x, y, z) * a = (r2, g2, b2)
Most egyéb problémák jönnek. Ha alfa már ismert, akkor az első egyenletből kívánkozik kiszámolni a keresendő színt, viszont ha az alfa elég kicsi, akkor egy nem fehér színből fehéret fog csinálni (ami világos, hogy rossz). A második egyenlettel szintén hasonlóak a problémák. Továbbá az alfa még mindig nem egyértelmű. A következőt mondom: a valid alfák közül válasszuk ki a legnagyobbat. Ezzel ugyanis minimalizálni lehet a hibalehetőséget.
Az eredmény egyelőre elég jó. Nem vezettem le az egész elméletet, lehetnek benne hibák. Kód itt.