将使用 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
转换为CIColor
? NSColor
有一个方法 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何在swift中将背景图像设置为colorWithPatternImage
UIImageView backgroundColor colorWithPatternImage 不显示
带有 Xcode 4.3.1 的 iOS 5.1:[UIColor colorWithPatternImage:] 奇怪的行为仅在设备上