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!
puoi spiegare questa parte? pixel = gammaCorrectedPixel * (outWhite - outBlack) + outBlack – Eric
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
quindi, in Black = 31, inGamma = 1,25 e inWhite = 255? Quindi, dobbiamo dividere questi valori per 255? –