Discussione sull’articolo "Studiare la classe CCanvas. Come disegnare oggetti trasparenti" - pagina 6
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Questo, Peter, è troppo facile.
Ecco un compito per voi, per padroneggiare e consolidare l'essenza della domanda:
- come mescolare due colori ARGB(a1,r1,g1,b1) e ARGB(a2,r2,g2,b2) all'interno di un livello, ognuno dei quali ha la propria trasparenza a1 e a2?
Senza questa fusione, è impossibile sovrapporre correttamente gli oggetti con anti-alias l'uno sull'altro.
In breve: sul colore del livello iniziale sovrapponiamo il primo ARGB(a1,r1,g1,b1) utilizzando il metodo descritto nell'articolo. Poi, sopra il primo colore, applichiamo il secondo, effettuando i calcoli ARGB secondo la stessa formula. Questa volta, però, il colore inferiore sarà il primo, applicato sopra il colore del livello originale.
Forse mi sbaglio, Nikolai, ma perché non dovrebbe funzionare?
ZY. Non ho ancora fatto esperimenti, ma la prima opzione potrebbe non funzionare perché la trasparenza finale dei due livelli superiori è calcolata in modo errato. In questo caso, è necessario mescolare il livello intermedio con il livello superiore e, dopo aver ottenuto il loro colore comune, sovrapporlo al livello originale.
In breve: sul colore del livello iniziale sovrapponiamo il primo ARGB(a1,r1,g1,b1) utilizzando il metodo descritto nell'articolo. Quindi, sopra il primo colore applichiamo il secondo, effettuando i calcoli ARGB secondo la stessa formula. Questa volta, però, il colore di fondo sarà il primo, che verrà applicato sopra il colore del livello iniziale.
Forse mi sbaglio, Nikolai, ma perché non dovrebbe funzionare?
ZY. Non ho ancora sperimentato, ma la prima opzione potrebbe non funzionare perché la trasparenza finale dei due livelli superiori è calcolata in modo errato. In questo caso, è necessario mescolare il livello centrale con quello superiore e, dopo aver ottenuto il loro colore comune, sovrapporlo al livello originale.
è in realtà una sfida, non facile.
Come? Avete sperimentato voi stessi? Probabilmente il colore superiore come filtro da utilizzare, calcolare ogni componente (rgb) del livello inferiore in proporzione al livello del componente corrispondente del livello superiore e alla trasparenza (si determina quanta parte di ciò che passerà dal basso attraverso l'alto). Quindi ricalcolare i livelli dei componenti dell'alto in base all'opacità (si determina quanta parte rimane dell'alto). Alla fine, calcolare la media di ogni componente dei livelli inferiore e superiore (non quelli originali, ma quelli ricalcolati, come scritto). Non ho provato.
Oppure sommare le componenti in proporzione alla trasparenza.
Dovrò sperimentare... compito interessante.
Come? L'avete sperimentato voi stessi?
Uffff... Tutto si è rivelato molto più semplice, senza bisogno di filtrare prima di impilare. I componenti vengono semplicemente aggiunti in proporzione alla trasparenza e all'opacità:
Alpha: 255 - il livello superiore è opaco, 0 - completamente trasparente.
lr, lg, lb - componenti del livello inferiore.
ur, ug, ub - componenti del livello superiore.
Qui nel terminale, sfondo nero, quadrato rosso opaco, su di esso blu con trasparenza al 50% e poi giallo con trasparenza al 50%.
Ecco la stessa cosa in Photoshop:
Uffff... Tutto si è rivelato molto più semplice, senza bisogno di filtrare prima di impilare. I componenti vengono semplicemente aggiunti in proporzione alla trasparenza e all'opacità:
Alpha: 255 - il livello superiore è opaco, 0 - completamente trasparente.
lr, lg, lb - componenti del livello inferiore.
ur, ug, ub - componenti del livello superiore.
Vado al computer, provo a mescolare due immagini trasparenti usando questa flrmula e vedo cosa succede. :))
Come si fa a mescolare due immagini trasparenti? La prima viene sovrapposta allo sfondo, poi la seconda viene sovrapposta al risultato.
In generale, si possono anche piegare due immagini trasparenti in qualche modo e poi sovrapporle allo sfondo, ma ora non si tratta di questo.
***
Sarebbe particolarmente interessante imparare tutti i metodi di sovrapposizione dei livelli come in Photoshop.
Uffff... Tutto si è rivelato molto più semplice, senza bisogno di filtrare prima di impilare. I componenti vengono semplicemente aggiunti in proporzione alla trasparenza e all'opacità:
Alpha: 255 - il livello superiore è opaco, 0 - completamente trasparente.
lr, lg, lb - componenti del livello inferiore.
ur, ug, ub - componenti del livello superiore.
Qui nel terminale, sfondo nero, quadrato rosso opaco, su di esso blu con trasparenza al 50% e poi giallo con trasparenza al 50%.
Ecco la stessa cosa in Photoshop:
non che ...
il punto è che ci sono Alpha1 e Alpha2.
Quindi è necessario calcolare non solo i colori di miscelazione di nuova formazione, ma anche la trasparenza di nuova formazione.
In sostanza hai ripetuto la formula dell'autore dell'articolo che mescola il colore trasparente con lo sfondo:
result=backgraund*(1-alpha)+foregrounde l'hai fatto:
result=backgraund*(1-alpha)+foreground*alphaLa tua variante è corretta, ma l'autore dell'articolo ha commesso un errore in una semplice formula, ed è divertente che Peter lo ringrazi per questa formula :))))
Dopo tutto, si può vedere a occhio nudo che l'overflow di uchar si verifica facilmente nella formula dell'autore. È strano che nessuno abbia visto questo errore grossolano per 4 anni.
è qui che si applica l'algoritmo di miscelazione di altri colori trasparenti: