Poprzez dostosowanie formuły z tej strony: http://http.developer.nvidia.com/GPUGems/gpugems_ch22.html, uważam, że można to zrobić za pomocą kombinacji CIColorMatrix
, CIGammaAdjust
i innymi CIColorMatrix
.
Nazwijmy poziomy wejściowe inBlack
, inGamma
i inWhite
odpowiednio, a poziomy wyjściowe outBlack
i outWhite
. Zauważ, że kolor Photoshopa zawiera się w przedziale od 0 do 255, natomiast kolory CI są w przedziale od 0 do 1, więc musisz podzielić wartości Photoshopa (z wyjątkiem inGamma
!) Przez 255 przed umieszczeniem ich w następujących formułach.
Mapowanie wejście jest pixel = (inPixel-inBlack)/(inWhite-inBlack)
, co oznacza, że pierwsza matryca będzie
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]
Następnie należy zastosować korekcję gamma używając CIGammaAdjust
oraz numer inGamma
(musiałem użyć odwrotność 1/inGamma
robiąc moich obliczeń, spróbować także!).
Wreszcie odwzorowanie wyjście jest piksel = gammaCorrectedPixel * (outWhite - outBlack) + outBlack
, co daje ostateczną matrycę
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]
Nie rzeczywiście próbował to za pomocą CoreImage, ale obliczenia wyszło ładnie!
Czy możesz wyjaśnić tę część? pixel = gammaCorrectedPixel * (outWhite - outBlack) + outBlack – Eric
Formuła z linku to 'outPixel = (pow ((inPixel * 255.0) - inBlack)/(inWhite - inBlack), inGamma) * (outWhite - outBlack) + outBlack)/255.0' tak, że jest to część poza 'pow' (formuła jest dekonstruowana w jedno mnożenie macierzy stosowane przed' pow', '' pow 'samo stosowane jako korekcja gamma, a następnie macierz dla wszystkiego, co dzieje się po'. pow). – jakber
, więc inBlack = 31, inGamma = 1,25 i inWhite = 255? Następnie musimy podzielić te wartości przez 255? –