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 に答える