2012-12-07 10 views
6

Sto mappatura diversi elementi photoshop per CIFilter, l'unico che sto avendo problemi con questo regolazione Livelli:Come posso mappare la regolazione del livello di Photoshop a un filtro Immagine principale?

screen shot from current version of photoshop

quale filtro CI (o combinazione di filtri) sarebbe lasciatemi utilizzare il 16, 1.73, 239 & 39/245 sopra nel primo esempio o il 31, 1,25, 255 30/255 nel secondo esempio. Credo che questo sia un tipo di regolazione del livello di ombre/bianco e nero.

Qualsiasi aiuto apprezzato.

risposta

8

Adattando la formula da questa pagina: http://http.developer.nvidia.com/GPUGems/gpugems_ch22.html, credo che si può fare questo usando una combinazione di CIColorMatrix, CIGammaAdjust e un altro CIColorMatrix.

Chiamiamo i livelli di ingresso inBlack, inGamma e inWhite rispettivamente, ed i livelli di uscita outBlack e outWhite. Si noti che i colori di Photoshop sono compresi tra 0 e 255, mentre i colori CI sono compresi tra 0 e 1, quindi è necessario dividere i valori di Photoshop (eccetto inGamma!) Di 255 prima di inserirli nelle seguenti formule.

La mappatura ingresso è pixel = (inPixel-inBlack)/(inWhite-inBlack), il che significa che la vostra prima matrice sarà

red = [1/(inWhite-inBlack) 0 0 0] 
green = [0 1/(inWhite-inBlack) 0 0] 
blue = [0 0 1/(inWhite-inBlack) 0] 
alpha = [0 0 0 1] 
bias = [-inBlack/(inWhite-inBlack), -inBlack/(inWhite-inBlack),-inBlack/(inWhite-inBlack), 0] 

Quindi si applica la correzione della gamma utilizzando CIGammaAdjust e il numero inGamma (ho dovuto usare l'inverso 1/inGamma quando fare i miei calcoli, provare che pure!).

Infine la mappatura uscita è pixel = gammaCorrectedPixel * (outWhite - outBlack) + outBlack, dandovi la matrice finale

red = [(outWhite - outBlack) 0 0 0] 
green = [0 (outWhite - outBlack) 0 0] 
blue = [0 0 (outWhite - outBlack) 0] 
alpha = [0 0 0 1] 
bias = [outBlack outBlack outBlack 0] 

Non ho effettivamente provato questo usando CoreImage, ma i calcoli funzionato bene!

+0

puoi spiegare questa parte? pixel = gammaCorrectedPixel * (outWhite - outBlack) + outBlack – Eric

+0

La formula dal collegamento era 'outPixel = (pow ((inPixel * 255.0) - inBlack)/(inWhite - inBlack), inGamma) * (outWhite - outBlack) + outBlack)/255.0' quindi quella è la parte esterna di 'pow' (la formula è decostruita in una moltiplicazione di matrici applicata prima del' pow', il 'pow' stesso applicato come correzione gamma e quindi una matrice per tutto ciò che accade dopo il' pow'). – jakber

+0

quindi, in Black = 31, inGamma = 1,25 e inWhite = 255? Quindi, dobbiamo dividere questi valori per 255? –

Problemi correlati