2つの色とnステップが与えられた場合、フェード効果を作成する2つの与えられた色を含むn色をどのように計算できますか?
可能であれば擬似コードが推奨されますが、これはおそらくJavaで実装されます。
ありがとう!
各色をRGBコンポーネントに分割してから、必要な個々の手順を計算します。
oldRed = 120;
newRed = 200;
steps = 10;
redStepAmount = (newRed - oldRed) / steps;
currentRed = oldRed;
for (i = 0; i < steps; i++) {
currentRed += redStepAmount;
}
明らかに、それを緑と青に拡張します。
また、確認する必要がある 2 つの適切な関連する質問があります。
多くの場合、RGB ではなく HSV 色空間でこれを行う方がよいことに注意してください。これにより、人間の目により心地よい色が生成されます (衝突または負の光学特性の可能性が低くなります)。
幸運を!
-アダム
ほとんどのカラー ピッカー GUI ウィジェットのように見えるブレンドが必要な場合は、HSL または HSV に変換する必要があります。そこから、おそらく各次元の線形補間で問題ありません。
RGB 色空間で直接補間をしようとするのは悪い考えです。あまりにも非線形です (この場合、ガンマ補正は役に立ちません)。
質問は、どのような変換を行いたいですか?あなたがHSV色空間に転置して与えられた場合
FF0000および00FF00
赤から黄、緑へと変化します。
ただし、「黒」またはその他のシェードをブレンドの中間点として定義する場合は、最初にその色にシェーディングする必要がありますff0000-> 000000-> 00ff00または白を介して:ff0000->ffffff->00ff00。
ただし、HSVを介した変換は、円形マップをベクトルコンポーネントにマップするために少しトリガーを使用する必要があるため、楽しい場合があります。
最も簡単な方法は、色成分間の線形補間です(nickfの応答を参照)。目は非常に非線形であることに注意してください。そのため、必ずしもステップを踏んでいるように見えるとは限りません。一部の色空間はこれに対処しようとします(CIEかもしれませんか?)。そのため、最初に別の色空間に変換し、補間してから、RGBまたは使用しているものに変換し直すことができます。
この答えはどうですか
- (UIColor *)colorFromColor:(UIColor *)fromColor toColor:(UIColor *)toColor percent:(float)percent
{
float dec = percent / 100.f;
CGFloat fRed, fBlue, fGreen, fAlpha;
CGFloat tRed, tBlue, tGreen, tAlpha;
CGFloat red, green, blue, alpha;
if(CGColorGetNumberOfComponents(fromColor.CGColor) == 2) {
[fromColor getWhite:&fRed alpha:&fAlpha];
fGreen = fRed;
fBlue = fRed;
}
else {
[fromColor getRed:&fRed green:&fGreen blue:&fBlue alpha:&fAlpha];
}
if(CGColorGetNumberOfComponents(toColor.CGColor) == 2) {
[toColor getWhite:&tRed alpha:&tAlpha];
tGreen = tRed;
tBlue = tRed;
}
else {
[toColor getRed:&tRed green:&tGreen blue:&tBlue alpha:&tAlpha];
}
red = (dec * (tRed - fRed)) + fRed;
green = (dec * (tGreen - fGreen)) + fGreen;
blue = (dec * (tBlue - fBlue)) + fBlue;
alpha = (dec * (tAlpha - fAlpha)) + fAlpha;
return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
}