3

我正在尝试定义一个非常简单的实用程序方法,这将使我不必使用计算器将 RGB 值定义为百分比。当我在 DrawView.m 文件的第 96 行查看 Apple 的示例代码“QuartzCache”时,我看到了:

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

但是,当我尝试创建如下方法时,编译器讨厌我。半小时的密集谷歌搜索没有产生任何帮助。

 +(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包含所有组件的 a,或将每个单独的组件包装在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

通常,您会使用 Cocoa 的NSColor类来处理此类事情,但看起来您正在做一些更底层的事情。

在这种情况下,我会执行以下操作:

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 回答