Xamarin.Mac/ディスプレイの物理サイズを取得する
< Xamarin.Mac
ナビゲーションに移動
検索に移動
2017年6月13日 (火) 01:37時点における103.22.200.204 (トーク)による版
概要
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のディスプレイで試そうと思ったがDisplayPortとMini DisplayPortの変換ケーブルが行方不明なので後日調査する。