Bằng cách điều chỉnh công thức từ trang này: http://http.developer.nvidia.com/GPUGems/gpugems_ch22.html, tôi tin rằng bạn có thể thực hiện việc này bằng cách kết hợp CIColorMatrix
, CIGammaAdjust
và một CIColorMatrix
khác.
Hãy gọi các mức đầu vào inBlack
, inGamma
và inWhite
tương ứng và mức đầu ra outBlack
và outWhite
. Lưu ý rằng màu của Photoshop nằm trong khoảng từ 0 đến 255 trong khi các màu CI nằm trong khoảng từ 0 đến 1, do đó bạn cần chia các giá trị Photoshop (trừ inGamma
!) Trước 255 trước khi đưa chúng vào các công thức sau.
Các bản đồ đầu vào là pixel = (inPixel-inBlack)/(inWhite-inBlack)
, có nghĩa là ma trận đầu tiên của bạn sẽ được
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]
Sau đó, bạn áp dụng hiệu chỉnh gamma sử dụng CIGammaAdjust
và số inGamma
(Tôi đã phải sử dụng nghịch đảo 1/inGamma
khi thực hiện các tính toán của tôi, cố gắng mà quá!).
Cuối cùng ánh xạ ra là điểm ảnh = gammaCorrectedPixel * (outWhite - outBlack) + outBlack
, cho bạn ma trận chính thức
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]
tôi đã không thực sự cố gắng này sử dụng CoreImage, nhưng các tính toán làm việc ra độc đáo!
bạn có thể giải thích phần này không? pixel = gammaCorrectedPixel * (outWhite - outBlack) + outBlack – Eric
Công thức từ liên kết là 'outPixel = (pow ((inPixel * 255.0) - inBlack)/(inWhite - inBlack), inGamma) * (outWhite - outBlack) + outBlack)/255.0' do đó là phần bên ngoài của 'pow' (công thức được giải mã thành một phép nhân ma trận được áp dụng trước' pow', bản thân 'pow' được áp dụng như hiệu chỉnh gamma và sau đó là ma trận cho mọi thứ xảy ra sau' pow'). – jakber
như vậy, inBlack = 31, inGamma = 1,25 và inWhite = 255? Sau đó, chúng ta phải chia các giá trị này cho 255? –