SKCanvas クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
描画に関するすべての状態をデバイス (ビットマップまたはサーフェス) にカプセル化します。
public class SKCanvas : SkiaSharp.SKObject
- 継承
- 派生
例
var info = new SKImageInfo(640, 480);
using (var surface = SKSurface.Create(info)) {
SKCanvas canvas = surface.Canvas;
canvas.Clear(SKColors.White);
// set up drawing tools
var paint = new SKPaint {
IsAntialias = true,
Color = new SKColor(0x2c, 0x3e, 0x50),
StrokeCap = SKStrokeCap.Round
};
// create the Xamagon path
var path = new SKPath();
path.MoveTo(71.4311121f, 56f);
path.CubicTo(68.6763107f, 56.0058575f, 65.9796704f, 57.5737917f, 64.5928855f, 59.965729f);
path.LineTo(43.0238921f, 97.5342563f);
path.CubicTo(41.6587026f, 99.9325978f, 41.6587026f, 103.067402f, 43.0238921f, 105.465744f);
path.LineTo(64.5928855f, 143.034271f);
path.CubicTo(65.9798162f, 145.426228f, 68.6763107f, 146.994582f, 71.4311121f, 147f);
path.LineTo(114.568946f, 147f);
path.CubicTo(117.323748f, 146.994143f, 120.020241f, 145.426228f, 121.407172f, 143.034271f);
path.LineTo(142.976161f, 105.465744f);
path.CubicTo(144.34135f, 103.067402f, 144.341209f, 99.9325978f, 142.976161f, 97.5342563f);
path.LineTo(121.407172f, 59.965729f);
path.CubicTo(120.020241f, 57.5737917f, 117.323748f, 56.0054182f, 114.568946f, 56f);
path.LineTo(71.4311121f, 56f);
path.Close();
// draw the Xamagon path
canvas.DrawPath(path, paint);
}
注釈
キャンバスは、描画に関するすべての状態をデバイス (ビットマップまたはサーフェス) にカプセル化します。
これには、デバイス自体への参照と、マトリックス/クリップ値のスタックが含まれます。 描画呼び出し (DrawRect など) の場合、描画されるオブジェクトのジオメトリは、スタック内のすべてのマトリックスの連結によって変換されます。 変換されたジオメトリは、スタック内のすべてのクリップの交差部分によってクリップされます。
キャンバスは描画デバイスの状態を保持しますが、描画されるオブジェクトの状態 (スタイル) はペイントによって保持され、各 "Draw" メソッドのパラメーターとして提供されます。 ペイントは、カラー、タイプフェイス、テキスト サイズ、ストロークの幅、シェーダー (グラデーション、パターンなど) などの属性を保持します。
キャンバスは、サーフェスの SKSurface.Canvas プロパティにアクセスするときに返されます。
Construction
SkiaSharp には、次のような SKCanvas 描画コマンドを受け取る複数のバックエンドがあります。
- ラスター Surface
- GPU Surface
- PDF ドキュメント
- XPS ドキュメント (試験段階)
- SVG キャンバス (試験段階)
- 画像
- Null キャンバス (テスト用)
ラスター Surfaceの構築
ラスター バックエンドはメモリ ブロックに描画されます。 このメモリは SkiaSharp またはクライアントによって管理できます。
Raster バックエンドと Ganesh バックエンドのキャンバスを作成する場合に推奨される方法は、キャンバス コマンドを描画するメモリを管理するオブジェクトである SKSurfaceを使用することです。
// define the surface properties
var info = new SKImageInfo(256, 256);
// construct a new surface
var surface = SKSurface.Create(info);
// get the canvas from the surface
var canvas = surface.Canvas;
// draw on the canvas ...
または、SkiaSharp に管理を依頼するのではなく、サーフェスのメモリを明示的に指定することもできます。
// define the surface properties
var info = new SKImageInfo(256, 256);
// allocate memory
var memory = Marshal.AllocCoTaskMem(info.BytesSize);
// construct a surface around the existing memory
var surface = SKSurface.Create(info, memory, info.RowBytes);
// get the canvas from the surface
var canvas = surface.Canvas;
// draw on the canvas ...
GPU Surfaceの構築
GPU サーフェスには、GPU コンテキストを管理する GRContext オブジェクトと、テクスチャとフォントの関連キャッシュが必要です。
GRContext オブジェクトは、OpenGL コンテキストまたは Vulkan デバイスと 1 対 1 で一致します。 つまり、同じ OpenGL コンテキストまたは Vulkan デバイスを使用してレンダリングされるすべての SKSurface インスタンスは、 GRContextを共有する必要があります。
SkiaSharp では、OpenGL コンテキストや Vulkan デバイスは作成されません。 また、OpenGL モードでは、SkiaSharp 呼び出しが行われるときに、正しい OpenGL コンテキストが現在のスレッドに対して現在のスレッドに対して行われていることも前提としています。
// an OpenGL context must be created and set as current
// define the surface properties
var info = new SKImageInfo(256, 256);
// create the surface
var context = GRContext.CreateGl();
var surface = SKSurface.Create(context, false, info);
// get the canvas from the surface
var canvas = surface.Canvas;
// draw on the canvas ...
PDF ドキュメントの作成
PDF バックエンドでは、ドキュメントに複数のページを含める必要があるため、SKSurfaceではなくSKDocumentを使用します。
// create the document
var stream = SKFileWStream.OpenStream("document.pdf");
var document = SKDocument.CreatePdf(stream);
// get the canvas from the page
var canvas = document.BeginPage(256, 256);
// draw on the canvas ...
// end the page and document
document.EndPage();
document.Close();
XPS ドキュメントの構築 (試験段階)
XPS バックエンドは、ドキュメントに複数のページを含める必要があるため、SKSurfaceではなくSKDocumentを使用します。
// create the document
var stream = SKFileWStream.OpenStream("document.xps");
var document = SKDocument.CreateXps(stream);
// get the canvas from the page
var canvas = document.BeginPage(256, 256);
// draw on the canvas ...
// end the page and document
document.EndPage();
document.Close();
SVG キャンバスの構築 (試験段階)
SVG バックエンドは SKSvgCanvasを使用します。
// create the canvas
var stream = SKFileWStream.OpenStream("image.svg");
var writer = new SKXmlStreamWriter(stream);
var canvas = SKSvgCanvas.Create(SKRect.Create(256, 256), writer);
// draw on the canvas ...
図の構築
XPS バックエンドでは、SKSurfaceではなくSKPictureRecorderが使用されます。
// create the picture recorder
var recorder = new SKPictureRecorder();
// get the canvas from the page
var canvas = recorder.BeginRecording(SKRect.Create(256, 256));
// draw on the canvas ...
// finish recording
var picture = recorder.EndRecording();
Null キャンバスの構築 (テスト用)
null キャンバスは、すべての描画コマンドを無視し、何も行わないキャンバスです。
// create the dummy canvas
var canvas = new SKNoDrawCanvas(256, 256);
// draw on the canvas ...
変化
キャンバスでは、多数の 2D 変換がサポートされています。 CoreGraphics や Cairo などの他の 2D グラフィック システムとは異なり、SKCanvas はパースペクティブを含むように変換を拡張します。
Scale、Skew、Translate、RotateDegrees、RotateRadiansを使用して、最も一般的な 2D 変換をいくつか実行できます。
より詳細な制御を行うには、 SetMatrix を使用して、 SKMatrix を使用して任意の変換を設定し、 Concat を使用して SKMatrix 変換を現在のマトリックスに連結できます。
ResetMatrixを使用して、マトリックスの状態をリセットできます。
絵
描画操作では、 SKPaint パラメーターを使用して図面に影響を与えることができます。 SKPaintオブジェクトを使用して、スタイルと色の情報をキャッシュして、ジオメトリ、テキスト、ビットマップを描画します。
クリッピングと状態
現在の変換マトリックスを保持する Save メソッドを呼び出すことで、現在の変換を保存できます。次に、 Restore または RestoreToCount メソッドを使用して、マトリックスを変更し、前の状態を復元できます。
さらに、領域のオフスクリーン コピーを作成する SaveLayer を使用して新しい状態をプッシュし、描画が完了したら、オフスクリーン ビットマップをこのキャンバスにコピーする Restore() メソッドを呼び出すことができます。
コンストラクター
| 名前 | 説明 |
|---|---|
| SKCanvas(SKBitmap) |
描画する指定したビットマップを含むキャンバスを作成します。 |
プロパティ
| 名前 | 説明 |
|---|---|
| Context |
このキャンバスに関連付けられている GPU 記録コンテキストを取得します。 |
| DeviceClipBounds |
現在のクリップの境界を取得します (デバイス座標)。 |
| Handle |
基になるネイティブ オブジェクトへのハンドルを取得または設定します。 (継承元 SKObject) |
| IgnorePublicDispose |
パブリック Dispose() の呼び出しを no-opするかどうかを示す値を取得します。 (継承元 SKNativeObject) |
| IsClipEmpty |
現在のクリップが空かどうかを示す値を取得します。 |
| IsClipRect |
現在のクリップが四角形かどうかを示す値を取得します。 |
| IsDisposed |
オブジェクトが既に破棄されているかどうかを示す値を取得します。 (継承元 SKNativeObject) |
| LocalClipBounds |
現在のクリップの境界を取得します (ローカル座標)。 |
| OwnsHandle |
このオブジェクトがハンドルを所有し、破棄されるときにネイティブ オブジェクトを破棄する必要があるかどうかを示す値を取得または設定します。 (継承元 SKNativeObject) |
| SaveCount |
キャンバスのプライベート スタック上のマトリックス/クリップ状態の数を取得します。 |
| Surface |
このキャンバスに関連付けられているサーフェスを取得します。 |
| TotalMatrix |
キャンバス上の現在のマトリックスを取得します。 |
| TotalMatrix44 |
キャンバス上の現在の 4 x 4 変換マトリックスを取得します。 |