cocoa - NSRectFill 在视网膜 MBP 上绘制两倍大

标签 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 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

最佳答案

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

在引入 Retina 显示屏时,Apple 重新定义了一些更高级别的 API,以为单位获取尺寸;而其他较低级别的则以像素为单位进行操作。如果您的应用程序使用文本、控件、矢量图形等,那么它很可能无需更改即可在 Retina 显示屏上运行。如果您使用位图图形,它也可能有效,但您的图像可能有点模糊(因为 OS X 制造了 Retina 分辨率所需的额外像素)。

就您而言,您发现 100 x 100 已被视为积分。我无法想象您的应用程序只包含这一张图像,因此,如果您希望在像素级别进行操作,那么毫无疑问,您会在其他地方受到影响。你需要做的是通读Apple的文档,High Resolution Guidelines for OS X是一个很好的起点。在那里你会看到有一个“转换坐标”部分可能特别适用,但从头开始;-)

HTH

关于cocoa - NSRectFill 在视网膜 MBP 上绘制两倍大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17119384/

相关文章:

iphone - 为圆圈添加发光效果

cocoa - 关于Delegate Protocol声明效果的问题

objective-c - Cocoa 如何记住多个显示器的窗口位置?

graphics - 如何画一个徒手画的椭圆或圆?

xcode - 在用户点击 UIView 内部的任何地方添加小圆圈/点(Swift)

c# - 有多少线穿过障碍物

performance - 提高 Quartz2D 绘图性能

macos - Mac 操作系统 : fastest way to list files of directory and get sizes

在 OS X Swift 应用程序中单击按钮时 Xcode 打印 "Hello World"的方法?

iphone - iOS 上的 UIGraphicsBeginImageContext 与 CGBitmapContextCreate