昨日私はUIColorを明るくする必要がある状況に遭遇したので、カテゴリを作成してlighten
メソッドを追加しました。色の各要素で値を掛けるだけで簡単だと思っていましたが、緑が黄色に変わり始めたので、もっと複雑にならなければなりませんでした。UIColorを明るくする
私が思いついた解決策は、sRGBからLinearに変換し、色を掛けてから変換することでした。これはうまくいくようですが、「正しい」かどうかはわかりません。私は、UIColorがsRGB空間にあったと述べた文書で何も見つけることができませんでした。私は色彩科学者もいないので、私は関与する数学についての初歩的な知識しか持っていません。
とにかくここに私のコードがあります。私はピアレビューを求めていますし、誰かがUIColorsの変更をよりよく理解しているかどうか確認しています。
CGFloat sRGB2Linear(CGFloat x){
CGFloat a = 0.055;
if(x <= 0.04045){
return x * (1.0/12.92);
}else{
return pow((x + a) * (1.0/(1 + a)), 2.4);
}
}
CGFloat linear2sRGB(CGFloat x){
CGFloat a = 0.055;
if(x <= 0.0031308){
return x * 12.92;
}else{
return (1 + a) * pow(x, 1/2.4) - a;
}
}
- (UIColor *)lighten:(CGFloat)value{
const CGFloat *components = CGColorGetComponents([self CGColor]);
CGFloat newR = (sRGB2Linear(components[0])+1)*value;
CGFloat newG = (sRGB2Linear(components[1])+1)*value;
CGFloat newB = (sRGB2Linear(components[2])+1)*value;
newR = MAX(0, MIN(1, linear2sRGB(newR)));
newG = MAX(0, MIN(1, linear2sRGB(newG)));
newB = MAX(0, MIN(1, linear2sRGB(newB)));
return [UIColor colorWithRed:newR green:newG blue:newB alpha:components[3]];
}
グレースケールの場合は機能しません。 – ozgur