ios - CAGradientLayer 在像素处获取颜色

标签 ios swift gradient cagradientlayer

我有一个带有许多颜色停止点的 CAGradientLayer。假设我知道所选图层上的点。如何获得该位置的像素颜色?

我正在尝试在渐变上选择一个位置,但我不确定如何在图层边界的特定点处获取图层的像素颜色。

最佳答案

查看我的示例,它根据我的 UISliders 位置值 0<=slider.value<=1.0f 插入颜色。如果您的 CAGradientLayer 的起点和终点不同,您将不得不更改映射的工作方式。我认为对于标准的起点和终点,渐变从左上角到右下角,在这种情况下,如果您将图层视为颜色条纹沿对角线方向延伸的矩形,您需要做的就是将矩形旋转 45 度然后仅使用应该允许您使用此方法的 x 或 y 位置(取决于您旋转的方式)。

-(UIColor *) getColor{

/*      //My pre declared code(just for clarity)
        @property (weak, nonatomic) IBOutlet UISlider *slider;
        CAGradientLayer*  gradientLayer;
        float colorCutoff;


        gradientLayer.colors = @[(__bridge id)[UIColor redColor].CGColor,(__bridge id)[UIColor orangeColor].CGColor,(__bridge id)[UIColor yellowColor].CGColor,(__bridge id)[UIColor  greenColor].CGColor,
        (__bridge id)[UIColor cyanColor].CGColor,(__bridge id)[UIColor blueColor].CGColor,(__bridge id)[UIColor purpleColor].CGColor];

        //This below allows for easy one direction interpolation
        gradientLayer.startPoint = CGPointMake(0.5,0.0);
        gradientLayer.endPoint = CGPointMake(0.5,1.0f);
        colorCutoff = 1/gradientLayer.colors.count;

 *
 *
 */
float interp  = _slider.value;
// 1.0f * colors.count == index out of bounds
if(interp >= 1.0f){
    interp = .99999f;
}

// think FLOOR(float * float)
int firstColor = (interp * (float)gradientLayer.colors.count);
int secondColor = firstColor +1;


// In case we are at the last color their is not one above it(index out of bounds)
if(secondColor >= gradientLayer.colors.count){
    firstColor--;
    secondColor--;
}

// In My case the closer you are to the colorCuttoff the more the second color should have a factor
// 0 is red .14 is orange .28 is yellow and soo on
float firstInterp = 1.0f - (fmodf(interp,colorCutoff) / colorCutoff);
float secondInterp = 1.0f - firstInterp;

// make use of the gradientLayer.colors array
const CGFloat *firstCGColor = CGColorGetComponents((__bridge CGColorRef)gradientLayer.colors[firstColor]);
const CGFloat *secondCGColor = CGColorGetComponents((__bridge CGColorRef)gradientLayer.colors[secondColor]);

float red = (firstCGColor[0] * firstInterp) + secondCGColor[0] * secondInterp;
float green = (firstCGColor[1] * firstInterp) + secondCGColor[1] * secondInterp;
float blue  = (firstCGColor[2] * firstInterp) + secondCGColor[2] * secondInterp;
return [UIColor colorWithRed:red green:green blue:blue alpha:1.0f]; 
}

关于ios - CAGradientLayer 在像素处获取颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34241739/

相关文章:

ios - Swift 3.0 迁移后 Alamofire 错误 : “Extra argument in Call' ” (request method)

json - 在 Swift 中迭代解码 JSON 的字典键

arrays - Swift:在不创建 Outlet 的情况下将按钮添加到数组?

ios - 检索外设与标识符 : What devices will be retrieved by this function?

cluster-analysis - 为什么 k-means 不给出全局最小值?

android - Java中的渐变背景颜色

ios - Swift 类未使用 NSNotificationCenter 注册来自 Objective C 类的通知发布

android - 在 PhoneGap 1.2.0 中使用 Google Analytics 时 Android 和 iOS 之间的差异

ios - 单个应用程序二进制文件如何支持 64 位和 32 位应用程序

internet-explorer - CSS 渐变在 IE9 中有效吗?