将使用 colorWithPatternImage 创建的 NSColor 转换为 CGColor?

Posted

技术标签:

【中文标题】将使用 colorWithPatternImage 创建的 NSColor 转换为 CGColor?【英文标题】:Converting a NSColor created with colorWithPatternImage to CGColor? 【发布时间】:2013-02-15 10:20:16 【问题描述】:

我已尝试多次将使用 colorWithPatternImage 的图像创建的 NSColor 来回转换为 CGColor。它总是失败,我得到奇怪的坏结果。

我想知道转换是否适用于平铺图像生成的颜色,或者根本不可能。这就是我转换颜色的方式:

-(CGColorRef) CIColorToCGColor: (CIColor *) ciColor 
    CGColorSpaceRef colorSpace = [ciColor colorSpace];
    const CGFloat *components = [ciColor components];
    CGColorRef cgColor = CGColorCreate (colorSpace, components);
    CGColorSpaceRelease(colorSpace);
    return cgColor;

...

CIColor *ciColor = [[CIColor alloc] initWithColor: [NSColor colorWithPatternImage:backgroundImage]];
CGColorRef cgColor = [self CIColorToCGColor: ciColor];
[ciColor release];

【问题讨论】:

为什么要先将NSColor 转换为CIColorNSColor 有一个方法 CGColor,那不行吗? 你怎么知道结果不对? @MartinR 该方法仅在 Mountain Lion 中可用 @RamyAlZuhouri 这就是它的样子:cl.ly/image/3r2d3C0I2b1C @Patrick 一张图片可能有多种颜色,这样你只需要它的一个像素。 【参考方案1】:

几周前我需要这样做。我找到了这个基本上解决问题的答案, How to tile the contents of a CALayer?

这里是更方便的形式,

// callback for CreateImagePattern.
static void DrawPatternImage (void *info, CGContextRef ctx) 
    CGImageRef image = (CGImageRef) info;
    CGContextDrawImage(ctx,
                       CGRectMake(0,0, CGImageGetWidth(image),CGImageGetHeight(image)),
                       image);


// callback for CreateImagePattern.
static void ReleasePatternImage( void *info ) 
    CGImageRelease((CGImageRef)info);


CGColorRef CreateCGColorWithPatternFromNSImage( NSImage *image ) 
    /* User needs to release the color  */

    NSData *imageData = [image TIFFRepresentation];
    CFDataRef cfImageData = CFBridgingRetain(imageData);
    CGImageSourceRef source = CGImageSourceCreateWithData(cfImageData, NULL);
    CGImageRef cgImage =  CGImageSourceCreateImageAtIndex(source, 0, NULL);
    CFRelease(cfImageData);
    CFRelease(source);


    //assume image is the CGImage you want to assign as the layer background
    CGFloat width = [image size].width;
    CGFloat height = [image size].height;
    static const CGPatternCallbacks callbacks = 0, &DrawPatternImage, &ReleasePatternImage;
    CGPatternRef pattern = CGPatternCreate (cgImage,
                                            CGRectMake (0, 0, width, height),
                                            CGAffineTransformMake (1, 0, 0, 1, 0, 0),
                                            width,
                                            height,
                                            kCGPatternTilingConstantSpacing,
                                            true,
                                            &callbacks);
    CGColorSpaceRef space = CGColorSpaceCreatePattern(NULL);
    CGFloat components[1] = 1.0;
    CGColorRef color = CGColorCreateWithPattern(space, pattern, components);
    CGColorSpaceRelease(space);
    CGPatternRelease(pattern);
    return color;

【讨论】:

【参考方案2】:

NSColor 有一个函数可以让你获得创建颜色的图案: -[NSColor patternImage]。使用该方法,将图像转换为 CGImage(如果您愿意),然后制作图案 CGColor。

编辑:另一种方法是,如果您使用的是 10.8 或更高版本,请使用 +[NSColor colorWithCGColor:] 类方法。但是,它可能在 %100 的时间里不起作用,因此请检查 nil。

【讨论】:

以上是关于将使用 colorWithPatternImage 创建的 NSColor 转换为 CGColor?的主要内容,如果未能解决你的问题,请参考以下文章

视网膜中的 colorWithPatternImage

如何在swift中将背景图像设置为colorWithPatternImage

bug - colorWithPatternImage:

UIImageView backgroundColor colorWithPatternImage 不显示

带有 Xcode 4.3.1 的 iOS 5.1:[UIColor colorWithPatternImage:] 奇怪的行为仅在设备上

来自 UIColor 的纹理?