Cocoa NSRectFill在视网膜MBP上绘制两倍大的图像

Cocoa NSRectFill在视网膜MBP上绘制两倍大的图像,cocoa,drawing,core-graphics,retina-display,nsimage,Cocoa,Drawing,Core Graphics,Retina Display,Nsimage,我试图绘制并保存一个简单的图像,但最终在MBP RD设备上保存的图像是原来的两倍: NSImage* image = [[NSImage alloc] initWithSize:size]; [image lockFocus]; [[NSColor blueColor] set]; NSRectFill(CGRectMake(0, 0, 100, 100)); [image unlockFocus]; // ... then save the image // Cache the red

我试图绘制并保存一个简单的图像,但最终在MBP RD设备上保存的图像是原来的两倍:

NSImage* image = [[NSImage alloc] initWithSize:size];
[image lockFocus];

[[NSColor blueColor] set];
NSRectFill(CGRectMake(0, 0, 100, 100));

[image unlockFocus];

// ... then save the image

// Cache the reduced image
NSData *imageData = [self TIFFRepresentation];
NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imageData];
NSDictionary *imageProps = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:1.0] forKey:NSImageCompressionFactor];
imageData = [imageRep representationUsingType:NSPNGFileType properties:imageProps];
[imageData writeToFile:fileName atomically:NO];

// image is saved as 200 x 200 :(

我希望有一个一致的大小,所以所有设备上都有100x100个

为什么您希望所有设备上都有一致的像素大小?如果你保持像素不变,在视网膜显示器上观看的尺寸就会变小。如果将点保持不变,则在任一显示器上查看的大小将相同,但基本像素数将增加四倍。根据应用程序的不同,两种选择都可能有效

在推出视网膜显示器时,苹果重新定义了一些更高级别的API,以点为单位计算大小;而另一些,较低级别,则以像素为单位。如果您的应用程序使用文本、控件、矢量图形等,则很有可能在视网膜显示上不会发生变化的情况下工作。如果您使用位图图形,它也可以工作,但您的图像可能有点模糊(因为OSX生产视网膜分辨率所需的额外像素)

在您的情况下,您发现您的100 x 100已被视为点数。我无法想象您的应用程序只包含这一幅图像,因此,如果您希望在像素级操作,毫无疑问,还有其他地方您会被这一点所困扰。你需要做的是阅读苹果的文档,这是一个很好的开始。在这里,您将看到“转换坐标”一节,它可能特别适用,但从开头开始;-)


HTH

我很欣赏你对点和像素的清晰解释,但正如你所见,我正在保存一张PNG图像。我正在制作的应用程序最终应该保存在两个屏幕上,这就是我的理由。我会看看指导方针,看看能做些什么。制作PNG并不重要——由于视网膜的变化,你的100x100被解释为点而不是像素。您将在这些文档中找到生成所需的两个图像所需的内容,并且可以将它们作为单个多分辨率TIFF文件输出。玩得高兴