7

给定从返回的 CGDirectDisplayID

CGError error = CGGetActiveDisplayList(8, directDisplayIDs, &displayCount);

对于 Retina MacBook Pro 上的内置屏幕,我希望使用获取本机像素尺寸

size_t pixelWidth = CGDisplayPixelsWide(directDisplayID);
size_t pixelHeight = CGDisplayPixelsHigh(directDisplayID);

但是,这些调用仅返回当前选定模式的维度。如果我改变屏幕分辨率,我会得到不同的值。我希望在 15" rMBP 上恢复 2880 x 1800。

如何获取 Retina MacBook Pro 屏幕的原生像素尺寸?

4

6 回答 6

3

我认为最好的方法是枚举所有显示模式(包括 1x 模式)并找到最大的 1x 模式的尺寸。

您将使用CGDisplayCopyAllDisplayModes()并传递带有kCGDisplayShowDuplicateLowResolutionModes映射到的键的字典kCFBooleanTrue作为options获取所有模式。您可以测试CGDisplayModeGetPixelWidth()等于CGDisplayModeGetWidth()以确定哪些是 1x。

于 2017-09-06T14:52:10.693 回答
2

CGDisplayModeGetIOFlags可以告诉你一些显示的信息。本机分辨率已kDisplayModeNativeFlag设置。下面将设置ns为窗口当前屏幕的原始分辨率win

CGDirectDisplayID sid = ((NSNumber *)[win.screen.deviceDescription
    objectForKey:@"NSScreenNumber"]).unsignedIntegerValue;
CFArrayRef ms = CGDisplayCopyAllDisplayModes(sid, NULL);
CFIndex n = CFArrayGetCount(ms);
NSSize ns;
for(int i = 0; i < n; ++i){
    CGDisplayModeRef m = (CGDisplayModeRef)CFArrayGetValueAtIndex(ms, i);
    if(CGDisplayModeGetIOFlags(m) & kDisplayModeNativeFlag){
        ns.width = CGDisplayModeGetPixelWidth(m);
        ns.height = CGDisplayModeGetPixelHeight(m);
        break;
    }
}
CFRelease(ms);
于 2018-11-30T05:07:35.777 回答
1

我会走不同的路线。我不会找出屏幕尺寸,而是获取正在运行程序的设备型号,然后将型号与其屏幕尺寸进行比较。对型号和相应的屏幕尺寸进行编程可能很乏味,但这是我能想到的唯一方法。希望这可以帮助。

于 2012-12-24T07:18:14.920 回答
0

如果 usingNSScreen是一个选项,您可以在 OSX 10.7 中执行以下操作:

NSRect framePixels = [screen convertRectToBacking:[screen frame]];

framePixels.size您的显示器的像素分辨率在哪里,并且是screen指向NSScreen. 例如,此代码会将所有活动显示器的像素分辨率打印到控制台:

for (NSScreen* screen in [NSScreen screens])
{
    NSRect framePixels = [screen convertRectToBacking:[screen frame]];
    NSLog(@"framePixels: (%f, %f)", framePixels.size.width, framePixels.size.height);
}
于 2013-02-11T21:46:38.870 回答
0

system_profiler SPDisplaysDataType | grep Resolution:

在两台显示器的机器上,我得到这个输出:

      Resolution: 2880 x 1800 Retina
      Resolution: 2560 x 1440 (QHD/WQHD - Wide Quad High Definition)

我从一个类似的问题中听说过这个:如何在 MacOS 上获得物理显示分辨率?

于 2019-11-21T00:36:04.647 回答
0

上面修改版的 Ken/jxy 解决方案,如果没有找到原生分辨率,默认使用 screen frame*backingScaleFactor:

static float getScreenScaleFactor() {
NSRect screenFrame = [[NSScreen mainScreen] frame];

// this may well be larger than actual pixel dimensions of screen, as Mac will report the backing scale factor of the render buffer, not the screen, stupidly
float bestWidth = screenFrame.size.width * [[NSScreen mainScreen] backingScaleFactor];

// if there's a native resolution found in this method, that's more accurate than above
CFArrayRef myModes = CGDisplayCopyAllDisplayModes(CGMainDisplayID(), NULL);
for (int i = 0; i < CFArrayGetCount(myModes); i++) {
    CGDisplayModeRef myMode = (CGDisplayModeRef) CFArrayGetValueAtIndex(myModes, i);
    if (CGDisplayModeGetIOFlags(myMode) & kDisplayModeNativeFlag) {
        bestWidth = CGDisplayModeGetPixelWidth(myMode);
        //printf("found native resolution: %i %i\n", (int)CGDisplayModeGetPixelWidth(myMode), (int)CGDisplayModeGetPixelHeight(myMode));
        break;
        }
    }

return bestWidth/screenFrame.size.width;
}
于 2021-08-20T07:07:39.383 回答