2017-01-28 45 views
2

SkiaSharpに回転テキストを描画する方法。SkiaSharpで回転テキストを描く

現在、私はSKCanvasを回転しています。テキストを描画し、それを元に戻します。しかし、私はこれを行うより効率的な方法があるかもしれないと思った。

canvas.RotateDegrees(45, 20, 20); 
    canvas.DrawText("Text", 20, 20, paint); 
    canvas.RotateDegrees(-45, 20, 20); 

答えて

2

これは正しい方法です(唯一の方法だと思います)。

実際にキャンバスを回転させるのではなく、描画行列(int[9]配列)を調整するほど効率的ではありません。ボンネットの下には、このような何かをやっている:あなたが描くとき

var m = SKMatrix.CreateRotation(45); // simple struct over int[9] 
canvas.CurrentMatrix.Concat(m)  // simple multiplication 

とはその後、それはちょうど行列使用しています:

canvas.DrawText(text, matrix); 

をし、あなたが戻って回転したときに、それだけで再び数学を行います。

もう一つの方法は、キャンバスを保存して復元することです:

canvas.Save(); 
canvas.Rotate(45); 
canvas.DrawText(text); 
canvas.Restore(); 

これだけの保存時に現在の行列のコピーを作成します。復元すると元の状態に戻ります。これは逆転することなく、一連の変換を行うことができるという点で「より良い」方法です。あなたが便利なタイプを利用することができます

または、テキストを描画する

// auto save 
using (new SKAutoCanvasRestore(canvas)) { 
    // do any transformations 
    canvas.Rotate(45); 
    // do serious work 
    canvas.DrawText(text); 
    // auto restore, even on exceptions or errors 
} 

別の、全く異なる道、道に沿って描画することです:

var path = new SKPath(); 
// create path ... 

// draw using path 
canvas.DrawText("text", path, hOffset: 0, vOffset: 0, paint); 
+0

Matthewありがとう、これは素晴らしいです。私はこのSkiaに非常に興奮しています。それは本当に有望で強力です。 – Vahid

1

あなたがに沿ってテキストを描画することができますSkiaSharpのパスです。たとえば、画像を斜めにテキストを描画する場合は、次のようになります。

using (SKPaint skPaint = new SKPaint()) 
{ 
    SKPath path = new SKPath(); 
    path.MoveTo(original.Width/10, original.Height - original.Height/10); 
    path.LineTo(original.Width - original.Width/10, original.Height/10); 

    canvas.DrawTextOnPath(textToWrite, path, 0, 0, skPaint); 
    path.Dispose(); 
} 

MeasureText to g文字の長さを計算し、それを対角線のパスの長さを計算し、DrawTextOnPathのパラメータで始点の値を設定するか、0,0以外のパスの原点を設定するかのどちらかを使用して中心にフィットさせます(例のように)

キャンバスを回転させるよりも効率的かどうかはわかりませんが、描画を行うのはより明白な方法です。

+0

ありがとう、私はこれに関するパフォーマンステストを行います。 – Vahid

+0

@Vahid perfテストはどのように行ったのですか? – gbjbaanb

関連する問題