2

我已经尝试过多次将使用 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];
4

2 回答 2

0

几周前我需要这样做。我发现这个答案基本上解决了这个问题, 如何平铺 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;
}
于 2013-02-15T11:12:40.180 回答
0

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

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

于 2013-05-25T22:00:25.653 回答