3

RGB値をパーセンテージとして定義するために計算機を使用する必要がなくなる、非常に単純なユーティリティメソッドを定義しようとしています。DrawView.m ファイルの 96 行目にある「QuartzCache」という Apple のサンプル コードを調べると、次のようになります。

float whiteColor[4] = {1, 1, 1, 1};

しかし、次のようなメソッドを作成しようとすると、コンパイラに嫌われます。集中的な 30 分間のグーグル検索は何の助けにもなりませんでした。

 +(float[])percentagesRGBArray:(float[])rgbArray{

        float red = rgbArray[0];
        float green = rgbArray[1];
        float blue = rgbArray[2];
        float alpha = rgbArray[3];
        red = red/255;
        green = green/255;
        blue = blue/255;
        alpha = alpha;
        float percentagesRGBArray[4] = {red, green, blue, alpha};


        return  percentagesRGBArray;
    }

そのようなメソッドを定義する適切な方法は何ですか? ここで何が間違っていますか?

4

4 に答える 4

5

すべてのコンポーネントを含むを定義するstructか、個々のコンポーネントを にまとめますNSNumber。または、インスタンスを使用しNSColorてカラー コンポーネントを含めます。

  • struct仕方:

    typedef struct
    {
        float red;
        float green;
        float blue;
        float alpha;
    } MyColor;
    
    - (MyColor) percentagesRGBArray:(MyColor) incoming
    {
        MyColor result;
        result.red = incoming.red / 255;
        result.green = incoming.green / 255;
        result.blue = incoming.blue / 255;
        result.alpha = incoming.alpha;
        return result;
    }
    
  • NSNumber仕方:

    - (NSArray *) percentagesRGBArray:(float[]) rgbArray
    {
        NSNumber *red = [NSNumber numberWithFloat:rgbArray[0] / 255];
        NSNumber *green = [NSNumber numberWithFloat:rgbArray[1] / 255];
        NSNumber *blue = [NSNumber numberWithFloat:rgbArray[2] / 255];
        NSNumber *alpha = [NSNumber numberWithFloat:rgbArray[3]];
    
        return [NSArray arrayWithObjects:red, green, blue, alpha, nil];
    }
    
  • NSColor仕方:

    - (NSColor *) percentagesRGBArray:(float[]) rgbArray
    {
        CGFloat red = rgbArray[0] / 255;
        CGFloat green = rgbArray[1] / 255;
        CGFloat blue = rgbArray[2] / 255;
        CGFloat alpha = rgbArray[3];
    
        return [NSColor colorWithDeviceRed:red
                                     green:green
                                      blue:blue
                                     alpha:alpha];
    }
    
于 2010-03-03T21:40:03.647 に答える
3

通常、NSColorこの種の処理には Cocoa のクラスを使用しますが、もう少し低レベルの処理を行っているように見えます。

その場合、私は次のようにします。

typedef struct
{
    float red;
    float green;
    float blue;
    float alpha;
}
RGBAData;

RGBAData ConvertRGBAToPercentages(const RGBAData source)
{
    RGBAData percentages;

    percentages.red = source.red/255;
    percentages.green = source.green/255;
    percentages.blue = source.blue/255;
    percentages.alpha = source.alpha/255;

    return percentages;
}

次のように使用します。

RGBAData original = { 0xFF, 0xFF, 0x00, 0x80 }; // 50% transparent yellow
RGBAData percents = ConvertRGBAToPercentages(original);
于 2010-03-03T21:39:03.703 に答える
2

e.James と dreamlax の両方の回答は、これを行うための優れたアプローチを提供します。しかし、元のコードの何が問題だったのかを答えるには:

基本的に、これは C 配列がどのように機能するかに関係しています。配列は基本的に、その最初の要素へのポインタと同等です。実際、配列を関数に渡すと、配列はポインターに崩壊します。引数に名前を付けることができますfloat myArray[4](要素の数を宣言する必要があります)。ポインターが 4 つの要素の配列であることを明確にするためです。次に、戻り値を考えます。あなたは何を返していますか?配列はポインターに崩壊するため、値によって配列を返すことができないことは既に確認しました。ただし、戻り値の型をポインターに変更しても、関数が戻ると配列がスコープ外になるため、機能しません。配列を返すには、メモリを malloc する必要があり、後で解放する必要があります。

これが、可能な限り C 配列を使用しないようにする理由です。彼らは本当に低レベルで厄介です。それらを使用する場合でも、通常は、低レベルの詳細を処理する API の背後にそれらを隠すことをお勧めします。

于 2010-03-03T21:54:31.270 に答える
0

私は遅れたと思います)しかし、私はちょうどこのスレッドを見つけました.

これを行う C の方法は、関数を呼び出す前に配列を作成することです。

+(void) percentagesRGBArray:(float[])inArray toArray:(float*)outArray {
    ...
} 

float array1[4];
float array2[4];
[MyClass percentagesRGBArray:array1 toArray:array2];
于 2010-09-02T11:12:02.687 に答える