-
Notifications
You must be signed in to change notification settings - Fork 0
MS_GDI
nishi_74322014 edited this page Aug 21, 2026
·
1 revision
- 戻る(ウィンドウ・システム)
-
GDI は直線や曲線の描画、フォントのレンダリング、パレットの制御といった処理を担当する、
カーネル及びユーザ モードの Windows の3つの主要コンポーネント
(Kernel32.dll,User32.dll,Gdi32.dll)の1つ(Gdi32.dll)であり、デバイス ドライバよりも上位に位置し、デバイスの機能的な調整と抽象化を役目とする。
-
また、グラフィカル オブジェクトをディスプレイやプリンタなどの
出力デバイスへ転送するための Windows の規格でもある。 -
このため、GDI を使うことにより、
- ディスプレイやプリンタなどの多様なデバイスに容易に描画でき、
- そして各デバイスで適切な表示結果を望むことができる。
-
なお、コントロールなどの上位レベルの描画は
User32.dll にあるユーザ サブシステムに任される。
補足(GDI の「デバイス非依存」という発想): 本文の
「多様なデバイスに容易に描画でき」という点が、GDI の設計の核心である。【デバイス コンテキスト(DC)】★ GDI の中心概念。 「描画先を抽象化したハンドル(HDC)」であり、 ・画面 … GetDC(hWnd) ・メモリ … CreateCompatibleDC(オフスクリーン描画) ・プリンタ … CreateDC("WINSPOOL", ...) ・メタファイル … CreateEnhMetaFile が【同じ API で描ける】 → 「画面に描くコード」を そのまま印刷にも使えるのが GDI の強み ★ → Windows Forms の PrintDocument が Graphics オブジェクトを渡してくるのは この設計を .NET に持ち込んだもの 【GDI オブジェクト】 ペン / ブラシ / フォント / ビットマップ / リージョン → 【SelectObject で DC に紐付けて使う】 → 使い終わったら DeleteObject で解放する → 【解放漏れ=GDI リーク】★ タスク マネージャの「GDI オブジェクト」列で確認できる 既定の上限は【プロセスあたり 10,000】 → 超えると描画が突然崩れる
GDI+ (gdiplus.dll) は GDI(Gdi32.dll)の後継である。
- Windows XP 以降で標準搭載されている他、
- Windows 98 / NT 4.0 SP6 以降で使用可能である。
GDI+ には、
- アルファブレンド(二つの画像を α 係数値により合成)
- アフィン変換(線型写像)
- グラデーション
- JPEG や PNG のような画像ファイルフォーマットのサポート
- イメージ エンコーダー / デコーダー機能
などが追加されている。
これらの機能は
- Windows XP の UI や、
- Flash、SVG(Scalable Vector Graphics)など
で利用されている。
補足(.NET から見た GDI+ と、その現在): GDI+ は
.NET の描画基盤そのものだったが、位置付けが大きく変わった。【System.Drawing = GDI+ のラッパー】★ Graphics → HDC + GDI+ の Graphics Pen / Brush / Font / Bitmap → GDI+ のオブジェクト → Windows Forms の描画(OnPaint)は すべてこの上に乗っている → 【IDisposable を必ず破棄する】 (ネイティブ資源を握っているため)★ 【.NET Core 以降の変化】★ ・.NET Core 2.0〜 System.Drawing.Common で利用可能 (非 Windows では libgdiplus に依存) ・【.NET 6】非 Windows は「サポート対象外」と明言 ・【.NET 7】非 Windows で PlatformNotSupportedException を投げるようになった ★ → 実質【Windows 専用ライブラリ】に戻った 【クロスプラットフォームで画像を扱うなら】★ ・【ImageSharp】(SixLabors)… 純マネージド。移植性が高い ・【SkiaSharp】(Google Skia のバインディング) → Chrome / Flutter と同じ描画エンジン → 高機能・高速 ★ ・【Magick.NET】(ImageMagick)… 変換用途に強い【描画技術の系譜】★ GDI(1985〜) → CPU 描画。デバイス非依存。今も OS の土台 GDI+(2001〜) → アンチエイリアス、透過、画像形式対応 → 【ハードウェア アクセラレーションがない】★ (=拡大・回転が重い) 【DirectX / Direct2D】(2009〜) → GPU 描画。GDI+ の実質的な後継 【WPF】(2006〜) → DirectX の上に構築されたベクタ UI → 詳細は [WPFのアーキテクチャ](MS_WPFArchitecture) 【DirectComposition / WinUI】 → 現在の Windows UI の描画基盤 ※ Windows Forms は今も GDI+ ベースであり、 【高 DPI・アニメーションに弱い】理由がここにある ★【原文の「Flash、SVG などで利用されている」について】 ・Adobe Flash は【2020年12月31日にサポート終了】★ ・SVG は仕様であって GDI+ の利用者ではない → 当時の SVG レンダラの一部が GDI+ を使っていた、という意味と解される ・現在の Windows の SVG 描画は → ブラウザ(Chromium/Skia) → Direct2D が担う
Tags: 移行, Windows, プログラミング
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。