2013-02-15 2 views
2

colorWithPatternImage가있는 이미지에서 생성 된 NSColor를 여러 번 시도하여 CGColor로 전달하려고 시도했습니다. 항상 실패하고, 나는 이상한 결과를 얻는다.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]; 
+1

왜 NSColor를 CIColor로 변환합니까? 'NSColor'는'CGColor' 메서드를 가지고 있습니다. –

+0

결과가 잘못되었음을 어떻게 알 수 있습니까? –

+1

@MartinR 그 방법은 Mountain Lion에서만 가능합니다. – aneuryzm

답변

0

내가 몇 주 전에이 작업을 수행하기 위해 필요한이 나는 색상을 변환하는 방법입니다. 나는 기본적으로 문제가 해결이 답변, 여기 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; 
} 
0

NSColor 당신이 색상으로 생성 된 패턴을 얻을 수있는 기능을 가지고있다 : -[NSColor patternImage]. 이 방법을 사용하여 이미지를 CGImage로 변환하고 원하는 경우 CGColor 패턴을 만듭니다.

편집 : 이것을 수행하는 또 다른 방법은 10.8 이상을 사용하는 경우 +[NSColor colorWithCGColor:] 클래스 메서드를 사용하는 것입니다. 그러나 % 100 시간 동안 작동하지 않을 수 있으므로 nil을 확인하십시오.

관련 문제