トップへ(mam-mam.net/)

GDI+で描画 ~Delphiソースコード集

GDI+で描画 ~Delphiソースコード集

DelphiでGDI+を使って描画する方法をサンプルソースコードで解説します。
GDI+を使用するには Uses に GDIPAPI, GDIPOBJ, GDIPUTIL を追加します。
uses GDIPAPI, GDIPOBJ, GDIPUTIL;

GDI+で描画するには TGPGraphics クラスのインスタンスを作成(オブジェクト)して使用します。

var GPGraphics:TGPGraphics;
begin GPGraphics := TGPGraphics.Create( 描画先のTCanvas.Handle ); //GPGraphicsを使って描画処理を行う GPGraphics.Free; end;

以下のサンプルソースコードは、フォームにTImageとTButtonをドラッグ&ドロップして、
Button1をクリックした時に
Image1.Picture.Bitmap
赤色、太さ6.5 で 座標(10,50)-(290,50)に線を引くサンプルです。

procedure TForm1.Button1Click(Sender: TObject);
var GPGraphics:TGPGraphics;
    GPPen:TGPPen;
begin
  Image1.Width:=300;
  Image1.Height:=300;
  Image1.Picture.Bitmap.Width:=300;
  Image1.Picture.Bitmap.Height:=300;

  //TGPGraphicsオブジェクトの作成
  GPGraphics := TGPGraphics.Create(Image1.Picture.Bitmap.Canvas.Handle);

  //ペンの作成 赤色、太さ6.5
  GPPen := TGPPen.Create(MakeColor(255,0,0), 6.5);

  //線の描画 (10,50)-(290,50)
  GPGraphics.DrawLine(GPPen, 10,50, 290,50);

  GPPen.Free;
  GPGraphics.Free;
end;

TGPGraphicsクラス

メソッド 解説 サンプル
SetSmoothingMode(スムージングモード); スムージングモードを
以下の値から設定します。
SmoothingModeNone
スムージングしない
SmoothingModeAntiAlias8x4
8X4ボックスフィルターのスムージング
SmoothingModeAntiAlias8x8
8X8ボックスフィルターのスムージング
var GPGraphics:TGPGraphics;
begin
  GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle);
  //アンチエイリアス(スムージング)を無効にする
  GPGraphics.SetSmoothingMode(SmoothingModeNone);
  //アンチエイリアス(スムージング)を有効にする
  GPGraphics.SetSmoothingMode(SmoothingModeAntiAlias8x4);
  GPGraphics.Free;
end;
DrawLine(TGPPen, x1,y1, x2,y2); 指定したペン(TGPPen)で
(x1,y1)-(x2,y2)に線を引く
var GPGraphics:TGPGraphics;
    GPPen:TGPPen;
begin
  GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle);

  //太さ6,5の赤色ペンの作成
  GPPen := TGPPen.Create(MakeColor(255,0,0), 6.5);
  //線の描画 (10,50)-(290,50)
  GPGraphics.DrawLine(GPPen, 10,50, 290,50);

  //ペンを太さ10の半透過青色に設定
  GPPen.SetWidth(10);
  GPPen.SetColor(MakeColor(128, 0,0,255));
  //線の描画 (250,0)-(250,100)
  GPGraphics.DrawLine(GPPen, 250,0, 250,100);

  GPPen.Free;
  GPGraphics.Free;
end;
DrawRectangle(TGPPen, TGPRect); 指定したペン(TGPPen)で
指定した矩形(TGPRect)を描画(輪郭線のみ)
var GPGraphics:TGPGraphics;
    GPPen:TGPPen;
begin
  GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle);

  //太さ6,5の赤色ペンの作成
  GPPen := TGPPen.Create(MakeColor(255,0,0), 6.5);
  //左上座標(100,150)、幅300、高さ50 の矩形領域に隣接する楕円を描画(線のみ)
  GPGraphics.DrawRectangle(
    GPPen,
    //    (左上x,左上y, 幅,高さ)
    MakeRect(100,150, 300,50)
  );

  GPPen.Free;
  GPGraphics.Free;
end;
FillRectangle(TGPBrush, TGPRect); 指定したブラシ(TGPBrush)で
指定した矩形領域(TGPRect)を塗り潰す
var GPGraphics:TGPGraphics;
    GPBrush:TGPBrush;
begin
  GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle);

  //ソリッド(べた塗り)ブラシの作成
  GPBrush:=TGPSolidBrush.Create(MakeColor(128, 0,255,0));
  //左上座標(100,100)、幅300、高さ50 の矩形領域を塗り潰す
  GPGraphics.FillRectangle(
    GPBrush,
    //    (左上x,左上y, 幅,高さ)
    MakeRect(100,100, 300,50)
  );

  GPBrush.Free;
  GPGraphics.Free;
end;
DrawEllipse(TGPPen, TGPRect); 指定したペン(TGPPen)で
指定した矩形領域(TGPRect)に
隣接する楕円を描画(輪郭線のみ)
var GPGraphics:TGPGraphics;
    GPBrush:TGPBrush;
    GPPen:TGPPen;
begin
  GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle);

  //線形グラデーションブラシの作成
  GPBrush:=TGPLinearGradientBrush.Create(
    MakePoint(100,200),      //座標1
    MakePoint(400,250),      //座標2
    MakeColor(255, 255,0,0), //座標1の色 赤
    MakeColor(255, 0,0,255)  //座標1の色 青
  );

  //太さ16,5で 線形グラデーションブラシを適用したペンの作成
  GPPen := TGPPen.Create(GPBrush, 16.5);
  //左上座標(100,150)、幅300、高さ50 の矩形領域に隣接する楕円を描画(線のみ)
  GPGraphics.DrawEllipse(
    GPPen,
    //    (左上x,左上y, 幅,高さ)
    MakeRect(100,150, 300,50)
  );

  GPBrush.Free;
  GPPen.Free;
  GPGraphics.Free;
end;
FillEllipse(TGPBrush, TGPRect); 指定したブラシ(TGPBrush)で
指定した矩形領域(TGPRect)に隣接する
楕円領域を塗り潰す
var GPGraphics:TGPGraphics;
    GPBrush:TGPBrush;
begin
  GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle);

  //線形グラデーションブラシの作成
  GPBrush:=TGPLinearGradientBrush.Create(
    MakePoint(100,200),      //座標1
    MakePoint(400,250),      //座標2
    MakeColor(255, 255,0,0), //座標1の色 赤
    MakeColor(255, 0,0,255)  //座標1の色 青
  );
  //左上座標(100,200)、幅300、高さ50 の矩形に隣接する楕円領域を塗り潰す
  GPGraphics.FillEllipse(
    GPBrush,
    //    (左上x,左上y, 幅,高さ)
    MakeRect(100,200, 300,50)
  );

  GPBrush.Free;
  GPGraphics.Free;
end;
DrawPie(TGPPen, TGPRect, 開始角度, 描画角度); 指定したペン(TGPPen)で
指定した矩形領域(TGPRect)に隣接する楕円で
開始角度(右方向を0度とする時計回りの度単位)
から描画角度分の円弧と中心線までの線(パイ形状)を描く。
(輪郭線のみ)
var GPGraphics:TGPGraphics;
    GPPen:TGPPen;
begin
  GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle);

  //太さ16,5で緑色のペンの作成
  GPPen := TGPPen.Create(MakeColor(255, 0,255,0), 16.5);
  //左上座標(100,150)、幅100、高さ80 の矩形に隣接する楕円の
  //22.5度から270度分のパイ形状を描く
  GPGraphics.DrawPie(
    GPPen,
    //    (左上x,左上y, 幅,高さ)
    MakeRect(100,150, 100,80),
    22.5,
    270
  );

  GPPen.Free;
  GPGraphics.Free;
end;
FillPie(TGPBrush, TGPRect, 開始角度, 描画角度); 指定したペン(TGPPen)で
指定した矩形領域(TGPRect)に隣接する楕円で
開始角度(右方向を0度とする時計回りの度単位)
から描画角度分の円弧と中心線までの線(パイ形状)を塗りつぶす。
var GPGraphics:TGPGraphics;
    GPBrush:TGPBrush;
begin
  GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle);

  //ハッチブラシの作成
  GPBrush:=TGPHatchBrush.Create(
    HatchStyle.HatchStyleVertical, //縦ハッチ
    MakeColor(255, 0,0,255),       //前方色
    MakeColor(255, 255,255,255)    //後方色
  );

  //左上座標(100,150)、幅100、高さ80 の矩形に隣接する楕円の
  //22.5度から270度分のパイ形状を塗りつぶす
  GPGraphics.FillPie(
    GPBrush,
    //    (左上x,左上y, 幅,高さ)
    MakeRect(100,150, 100,80),
    22.5,
    270
  );

  GPBrush.Free;
  GPGraphics.Free;
end;
DrawArc(TGPPen, TGPRect, 開始角度, 描画角度); 指定したペン(TGPPen)で
指定した矩形領域(TGPRect)に隣接する楕円で
開始角度(右方向を0度とする時計回りの度単位)
から描画角度分の円弧を描く。
var GPGraphics:TGPGraphics;
    GPPen:TGPPen;
begin
  GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle);

  //太さ6,5の赤色ペンの作成
  GPPen := TGPPen.Create(MakeColor(255,0,0), 6.5);
  //左上座標(150,200)、幅100、高さ50 の矩形に隣接する楕円の
  //22.5度から270度分の円弧を描く
  GPGraphics.DrawArc(
    GPPen,
    //    (左上x,左上y, 幅,高さ)
    MakeRect(150,200, 100,50),
    22.5,
    270
  );

  GPPen.Free;
  GPGraphics.Free;
end;
DrawLines(TGPPen, PGPPoint, Count); 指定したペン(TGPPen)で
PGPPointで与えた頂点を結ぶ線を描く
但しCount個分の頂点のみ
以下の例の場合、引数に PGPPoint(@GPPoints[1]), 3
を与えているので、GPPoints[1]~GPPoints[3]
を結ぶ線を描画します。
var GPGraphics:TGPGraphics;
    GPPen:TGPPen;
    GPPoints:Array of TGPPoint; //TGPPointFも存在します
begin
  GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle);

  SetLength(GPPoints,5);
  GPPoints[0]:=MakePoint(0,0);
  GPPoints[1]:=MakePoint(200,100);
  GPPoints[2]:=MakePoint(300,100);
  GPPoints[3]:=MakePoint(300,200);
  GPPoints[4]:=MakePoint(200,400);

  //太さ10の赤色ペンの作成
  GPPen := TGPPen.Create(MakeColor(255,0,0), 10);
  //ペンの描画開始形状を丸に設定
  GPPen.SetStartCap(LineCapRound);
  //ペンの接合形状を面取り(ベベル)に設定
  GPPen.SetLineJoin(LineJoinBevel);
  //ペンの描画終了形状を矢印に設定
  GPPen.SetEndCap(LineCapArrowAnchor);

  //アンチエイリアス(スムージング)を有効にする
  GPGraphics.SetSmoothingMode(SmoothingModeAntiAlias8x4);

  //GPPoints[1]~GPPoints[3]を結ぶ線を描画
  GPGraphics.DrawLines(
    GPPen, PGPPoint(@GPPoints[1]), 3
  );

  GPPen.Free;
  GPGraphics.Free;
end;

TGPPen(ペン)クラス

メソッド 解説 サンプル
Create(TGPColor, 線の太さ); 指定色、指定太さのペンを作成
var GPGraphics:TGPGraphics;
    GPPen:TGPPen;
begin
  GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle);

  //太さ3.2の不透明の赤色ペンの作成
  GPPen := TGPPen.Create(MakeColor(255, 255,0,0), 3.2);
  
  //線の描画 (150,0)-(250,100)
  GPGraphics.DrawLine(GPPen, 150,0, 250,100);

  GPPen.Free;
  GPGraphics.Free;
end;
Create(TGBrush, 線の太さ); TGBrushを適用した
指定太さのペンを作成
var GPGraphics:TGPGraphics;
    GPPen:TGPPen;
    GPBrush:TGPBrush;
begin
  GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle);

  //ハッチブラシの作成
  GPBrush:=TGPHatchBrush.Create(
    HatchStyle.HatchStyleCross, //クロスハッチ
    MakeColor(255, 0,0,255),    //前方色
    MakeColor(255, 255,255,255) //後方色
  );

  //太さ10のハッチブラシを適用したペンの作成
  GPPen := TGPPen.Create(GPBrush, 10);

  //線の描画 (150,0)-(250,100)
  GPGraphics.DrawLine(GPPen, 150,0, 250,100);

  GPBrush.Free;
  GPPen.Free;
  GPGraphics.Free;
end;
SetWidth(ペンの太さ); ペンの太さ(幅)を変更する
var GPGraphics:TGPGraphics;
    GPPen:TGPPen;
    GPPoints:Array of TGPPoint;
    Dash:Array of Single;
begin
  GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle);

  SetLength(GPPoints,3);
  GPPoints[0]:=MakePoint(200,100);
  GPPoints[1]:=MakePoint(300,100);
  GPPoints[2]:=MakePoint(300,200);

  //太さ12の不透明の赤色ペンの作成
  GPPen := TGPPen.Create(MakeColor(255, 255,0,0), 12);

  //ペンの太さを2に変更
  GPPen.SetWidth(2);

  //ペンの色を半透過の赤色に変更
  GPPen.SetColor(MakeColor(128, 255,0,0));

  //アンチエイリアス(スムージング)を有効にする
  GPGraphics.SetSmoothingMode(SmoothingModeAntiAlias8x4);

  //ペンの描画開始形状を丸に設定
  GPPen.SetStartCap(LineCapRound);
  //ペンの描画終了形状を矢印に設定
  GPPen.SetEndCap(LineCapArrowAnchor);
  //ペンの接合形状を面取り(ベベル)に設定
  GPPen.SetLineJoin(LineJoinBevel);

  //カスタムの破線を設定
  SetLength(Dash, 4);
  Dash[0]:=  4/GPPen.GetWidth;
  Dash[1]:=  4/GPPen.GetWidth;
  Dash[2]:= 16/GPPen.GetWidth;
  Dash[3]:=  4/GPPen.GetWidth;
  GPPen.SetDashPattern(PSingle(@Dash[0]), Length(Dash));


  //GPPoints[0]~GPPoints[2]を結ぶ線を描画
  GPGraphics.DrawLines(
    GPPen, PGPPoint(@GPPoints[0]), Length(GPPoints)
  );

  GPPen.Free;
  GPGraphics.Free;
end;
SetColor(TGPColor); ペンの色をTGPColorに変更する
SetStartCap(ペンの描画開始形状); ペンの描画開始形状を変更する
LineCapSquare
正方形(幅と高さは線の幅)
LineCapRound
円形(直径は線の幅)
LineCapTriangle
三角形(ベースは線の幅)
LineCapSquareAnchor
正方形(幅と高さは線の幅より大きい)
LineCapRoundAnchor
円形(直径は線の幅より大きい)
LineCapDiamondAnchor
ひし形[45度回転した四角形]
(ひし形は線の幅より大きい)
LineCapArrowAnchor
矢印(矢印は線より大きい)
LineCapCustom
CustomLineCapから作成することを指定
SetEndCap(ペンの描画終了形状); ペンの描画終了形状を変更する
指定できる値は上記の SetStartCap と同じ
SetLineJoin(ペンの描画接合形状); ペンの描画接合形状を変更する
(線と線の接合部分の形状)
LineJoinMiter
制限値により鋭角接合又はクリッピングされた角になる
LineJoinBevel
面取り接合
LineJoinRound
角丸接合
LineJoinMiterClipped
制限値により鋭角接合又は斜めになった角になる
SetDashPattern(PSingle, Count); カスタム破線を設定する

TGPBrush(ブラシ)派生クラス

以下はブラシの派生クラスの一部抜粋です。

クラス 解説 サンプル
TGPSolidBrush.Create(TGPColor); 指定色のべた塗りブラシを作成
var GPBrush:TGPBrush;
begin
  //緑色のブラシを作成
  GPBrush:=TGPSolidBrush.Create(MakeColor(0,255,0));
  GPBrush.Free;

  //青色の半透過ブラシを作成
  GPBrush:=TGPSolidBrush.Create(MakeColor(128, 0,0,255));
  GPBrush.Free;
end;
TGPLinearGradientBrush.Create(p1,p2:TGPoint ; Color1,Color2:TGPColor); 座標p1の色Color1から、座標p2の色Color2のグラデーションブラシを作成
var GPBrush:TGPBrush;
begin
  //線形グラデーションブラシの作成
  GPBrush:=TGPLinearGradientBrush.Create(
    MakePoint(100,200),      //座標1
    MakePoint(400,250),      //座標2
    MakeColor(255, 255,0,0), //座標1の色 赤
    MakeColor(255, 0,0,255)  //座標1の色 青
  GPBrush.Free;
end;
TGPHatchBrush.Create(Style:TGPHatchStyle, ForeColor,BackColor:TGPColor); 指定したスタイル、前方色(ForeColor)、後方色(BackColor)のハッチブラシを作成
スタイルには以下のような値を指定できる(一部抜粋)
HatchStyleHorizontal:水平ハッチ
HatchStyleVertical:縦ハッチ
HatchStyleForwardDiagonal:左上から右下ハッチ
HatchStyleBackwardDiagonal:左下から右上ハッチ
HatchStyleCross:クロスハッチ
HatchStyleDiagonalCross:45度クロスハッチ
HatchStyle10Percent:10%のドットハッチ
var GPBrush:TGPBrush;
begin
  //ハッチブラシの作成
  GPBrush:=TGPHatchBrush.Create(
    HatchStyle.HatchStyleCross, //クロスハッチ
    MakeColor(255, 0,0,255),    //前方色
    MakeColor(255, 255,255,255) //後方色
  );
  GPBrush.Free;
end;