web-dev-qa-db-ja.com

UIColorをHueSaturation Brightnessに変換する機能はありますか?

rGB値でuicolorを設定できます:

[UIColor colorWithRed:0.53 green:0.37 blue:0.11 alpha:1.00];

hsb値でuicolorを設定できます:

[UIColor colorWithHue:0.10 saturation:0.16 brightness:0.13 alpha:1.00];

rGBに戻すこともできます:

CGFloat* colors = CGColorGetComponents(Color1.CGColor);

しかし、どうすればuicolorからHSBを取得できますか?

17
Horhe Garcia

UIColorメソッドを使用します:getHue:saturation:brightness:alpha:

Appleドキュメントから:
"HSB色空間の色を構成するコンポーネントを返します。"

- (BOOL)getHue:(CGFloat *)hue saturation:(CGFloat *)saturation brightness:(CGFloat *)brightness alpha:(CGFloat *)alpha

例:

UIColor *testColor = [UIColor colorWithRed:0.53 green:0.37 blue:0.11 alpha:1.00];

CGFloat hue;
CGFloat saturation;
CGFloat brightness;
CGFloat alpha;
BOOL success = [testColor getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha];
NSLog(@"success: %i hue: %0.2f, saturation: %0.2f, brightness: %0.2f, alpha: %0.2f", success, hue, saturation, brightness, alpha);

NSLog出力:

成功:1色相:0.10、彩度:0.79、明るさ:0.53、アルファ:1.00

@WhiteTigerが提供するメソッドの修正バージョンは次のとおりです。

// Test values
CGFloat red = 0.53;
CGFloat green = 0.37;
CGFloat blue = 0.11;

CGFloat hue = 0;
CGFloat saturation = 0;
CGFloat brightness = 0;

CGFloat minRGB = MIN(red, MIN(green,blue));
CGFloat maxRGB = MAX(red, MAX(green,blue));

if (minRGB==maxRGB) {
    hue = 0;
    saturation = 0;
    brightness = minRGB;
} else {
    CGFloat d = (red==minRGB) ? green-blue : ((blue==minRGB) ? red-green : blue-red);
    CGFloat h = (red==minRGB) ? 3 : ((blue==minRGB) ? 1 : 5);
    hue = (h - d/(maxRGB - minRGB)) / 6.0;
    saturation = (maxRGB - minRGB)/maxRGB;
    brightness = maxRGB;
}
NSLog(@"hue: %0.2f, saturation: %0.2f, value: %0.2f", hue, saturation, brightness);

NSLog出力:

色相:0.10、彩度:0.79、値:0.53

43
zaph

Swift機能(拡張機能、計算されたプロパティ、タプル)を使用して、わずか数行のコードで同じことを行うための優れた方法を次に示します。

extension UIColor {
  var hsba: (h: CGFloat, s: CGFloat, b: CGFloat, a: CGFloat) {
    var hsba: (h: CGFloat, s: CGFloat, b: CGFloat, a: CGFloat) = (0, 0, 0, 0)
    self.getHue(&(hsba.h), saturation: &(hsba.s), brightness: &(hsba.b), alpha: &(hsba.a))
    return hsba
  }
}

Swift 3.2/4マイナーアップデート

Swift 3.2/4は、hsbaへの同じ呼び出し内でgetHue変数を数回変更していたため、前のコードでトリガーされた新しい警告を強制しました。

パラメータ「hsba」への同時アクセス。ただし、変更には排他的アクセスが必要です。ローカル変数へのコピーを検討してください。

extension UIColor {
    var hsba:(h: CGFloat, s: CGFloat,b: CGFloat,a: CGFloat) {
        var h: CGFloat = 0, s: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0
        self.getHue(&h, saturation: &s, brightness: &b, alpha: &a)
        return (h: h, s: s, b: b, a: a)
    }
 }
25
apouche

ドラフトであることに注意してください。ただし、バージョン5.0より前の場合は、このコードを試すことができます。

...
CGFloat computedH = 0;
CGFloat computedS = 0;
CGFloat computedV = 0;

CGFloat minRGB = MIN(r, MIN(g,b));
CGFloat maxRGB = MAX(r, MAX(g,b));

if (minRGB==maxRGB) {
   computedH = 0;
   computedS = 0;
   computedV = minRGB;
} else {
   double d = (r==minRGB) ? g-b : ((b==minRGB) ? r-g : b-r);
   double h = (r==minRGB) ? 3 : ((b==minRGB) ? 1 : 5);
   computedH = (60*(h - d/(maxRGB - minRGB))) / 360.;
   computedS = ((maxRGB - minRGB)/maxRGB);
   computedV = maxRGB;
}
...
4
WhiteTiger

次のコードセグメントを使用するだけで、rgba、hsba変換が完了します。

extension UIColor {

/**
 Decomposes UIColor to its RGBA components
 */
var rgbColor: RGBColor {
    get {
        var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0, alpha: CGFloat = 0
        self.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
        return RGBColor(red: red, green: green, blue: blue, alpha: alpha)
    }
}

/**
 Decomposes UIColor to its HSBA components
 */
var hsbColor: HSBColor {
    var h: CGFloat = 0, s: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0
    self.getHue(&h, saturation: &s, brightness: &b, alpha: &a)
    return HSBColor(hue: h, saturation: s, brightness: b, alpha: a)
}

/**
 Holds the CGFloat values of HSBA components of a color
 */
public struct HSBColor {
    var hue: CGFloat
    var saturation: CGFloat
    var brightness: CGFloat
    var alpha: CGFloat

    var uiColor: UIColor {
        get {
            return UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: alpha)
        }
    }
}

/**
 Holds the CGFloat values of RGBA components of a color
 */
public struct RGBColor {
    var red: CGFloat
    var green: CGFloat
    var blue: CGFloat
    var alpha: CGFloat

    var uiColor: UIColor {
        get {
            return UIColor(red: red, green: green, blue: blue, alpha: alpha)
        }
    }
}
}
1
Jiachen Ren