Skip to content
nishi_74322014 edited this page Aug 21, 2026 · 1 revision

GDI

概要

GDI

  • 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+

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, プログラミング

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally