Xamarin.Mac/ディスプレイの物理サイズを取得する

提供: MonoBook
移動: 案内検索

概要[編集]

Macに繋がっているディスプレイの物理的な大きさを取得したい。 解像度ではなくミリ単位の物理的な大きさ。

用途としては「写真を実物大で表示してほしい」という要望のために1ピクセルが何ミリかを計算したいのである。 縦横の物理的な大きさがわかれば、あとは解像度で割り算してやることで1ピクセルが何ミリなのかがわかる。

実装[編集]

MonoMacにもXamarin.MacにもそんなAPIはみあたらない。 だがCoreGraphicsを直叩きすることでディスプレイの物理的な大きさを取得できるようだ。

なお、この記事のタイトルにXamarin.Macとあるが、以下はMonoMacでの実装である。

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using MonoMac.Foundation;
using MonoMac.AppKit;
using MonoMac.CoreGraphics;
 
namespace PhysicalDisplaySize
{
    public  static class CGDisplay
    {
        public const string DllName = "/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics";
 
        [DllImport(DllName)]
        extern static SizeF CGDisplayScreenSize(UInt32 displayId);
 
        public static SizeF ScreenSize(UInt32 displayId)
        {
            return CGDisplayScreenSize(displayId);
        }
    }
 
    class MainClass
    {
        static void Main(string[] args)
        {
            NSApplication.Init();
 
            // ディスプレイIDを取得する
            var displayId = (NSNumber)NSScreen.MainScreen.DeviceDescription["NSScreenNumber"];
 
            // ディスプレイの物理的な大きさを取得する
            var size = CGDisplay.ScreenSize(displayId.UInt32Value);
 
            // 27インチのThunderbolt Display では以下の値が返ってきた。
            // {Width=596.5505, Height=335.5596}
            // 巻尺でディスプレイの大きさを測ってみたところ上記の単位はミリメートルのようだ。
            Console.WriteLine(size);
        }
    }
}

アップル謹製のThuderbolt Displayでしか試していないので他社製品でうまく取得できるかは謎である。 EIZOのディスプレイで試そうと思ったがDisplayPortMini DisplayPortの変換ケーブルが行方不明なので後日調査する。

関連項目[編集]

参考文献[編集]