問題タブ [graphicspath]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
6186 参照

c# - .Net GraphicsPath.Widen() の反対

GraphicsPath.Widen().Net のメソッドの反対が必要です。

Widen()メソッドは負のパラメーターを受け入れないため、メソッドに相当するものが必要ですInset

オープン ソースの Inkscape アプリケーション (www.Inkscape.org) でこれを行うには、メニューに移動して [パス / インセット] を選択します (インセット量は [Inkscape プロパティ] ダイアログに保存されます)。Inkscape はオープン ソースであるため、C#.Net でこれを実行できるはずですが、一生 Inkscape C++ ソースをたどることはできません (必要なのはこの 1 つの関数だけなので、C++ の学習を正当化することはできません)。これを完了するために)。

基本的に、次のシグネチャを持つ GraphicsPath 拡張メソッドが必要です。

署名が述べているように、渡された量だけGraphicsPathオブジェクトと.Inset()パスを受け取ります... Inkscapeが今日行っているように。問題を単純化すると、問題の GraphicsPaths はすべて.PolyBezierメソッドから作成されます (他には何もありません)。したがって、完全を期す場合を除き、四角形、楕円形、またはその他の形状を考慮する必要はありません。

残念ながら、私は C++ コードの経験がないので、Inkscape に含まれる C++ ロジックに従うことはほぼ不可能です。

.

[編集:] リクエストに応じて、「MakeOffset」Inkscape コードを次に示します。2 番目のパラメーター (double dec) は Inset の負の値であり、そのパラメーターの絶対値は形状を取り込む量です。

ここには多くの依存関係があることを知っています。Inkscape のソース ファイルをもっと見る必要がある場合は、ここにあります: http://sourceforge.net/projects/inkscape/files/inkscape/0.48/

.

[編集]

@Simon Mourier - すばらしい仕事です。コードもきれいで読みやすいものでした! よくやった、サー。ただし、いくつか質問があります。

まず、Amount の正の数は何を表しているのでしょうか。Offset メソッドの場合、正は「アウトセット」、負は「インセット」になると考えていましたが、あなたの例は逆のようです。

次に、いくつかの基本的なテスト (サンプルを拡張するだけ) を行ったところ、奇妙な点がいくつか見つかりました。

オフセットが大きくなると、cool の "l" に何が起こるかを次に示します (このような単純な文字の場合、問題が発生するのは確かです!)。

サイモン テスト 2

...そしてそれを再現するコード:

最後に、少し違うものを。これは Wingdings の「S」の文字です (涙のしずくのように見えます)。

ティアドロップ

コードは次のとおりです。

ほら、近すぎて泣きたくなる。しかし、それでもうまくいきません。

挿入ベクトルがいつ交差するかを確認し、その時点を過ぎて挿入を停止することで修正できると思います。Inset の量が非常に大きい (またはパスが非常に小さい) ために何も残っていない場合、パス自体を元に戻して再度拡張するのではなく、パスが消える (null になる) 必要があります。

繰り返しますが、私はあなたが行ったことを決して非難しているわけではありませんが、これらの例で何が起こっているのか知っているかどうか疑問に思っていました.

(PS - 拡張メソッドにするために「this」キーワードを追加したため、これらのサンプルを実行するには、メソッド (パラメーター) 表記を使用してコードを呼び出す必要がある場合があります)

.

@RAN Ran は、GraphicsPath ネイティブ メソッドを再利用して、同様の出力を作成します。男、これは大変です。二人ともとても近いです。

以下は、Wingdings の文字「S」を使用した両方の例のスクリーン ショットです。

ティアドロップ比較

左が @Simon、右が @Ran です。

これは、Inkscape で「インセット」を実行した後の同じティア ドロップ「S」文字です。インセットはきれいです:

Inkscape を引き裂く

ちなみに、@Ran のテストのコードは次のとおりです。

0 投票する
2 に答える
1126 参照

c# - 円形の GraphicsPath に沿った GDIPlus グラデーション

グラフィックパスに「ドーナツ」があります。

そのパスに沿ってグラデーションを描画し、円の特定の開始角度と終了角度で色の開始と終了を制御したいと思います。

このような:

http://www.andresilvadesign.com/wp-content/uploads/2011/01/Gauge-icon-design.jpg

LinearGradient は 1 つの角度しか移動できず、適切にパスをたどりません。

PathGradientBrush はただのようです..円形のグラデーションですか? C#でこれを適切に行う方法が見つからないようです。

どんな助けでも大歓迎です!

0 投票する
4 に答える
10024 参照

c# - SVG パス データを GDI+ GraphicsPath データに変換する

SVG パス タグを C# System.Drawing.Drawing2D.GraphicsPath に変換する簡単な方法はありますか? どちらも密接に関連しており、SVG パス データを GraphicsPath ポイントに簡単に変換できることを期待していました。

0 投票する
1 に答える
3206 参照

c# - 新しいオブジェクトに行列変換を実装する

.Net のいくつかの GraphicsPath オブジェクトと共に、自分のオブジェクトの 1 つを変換できる必要があります。GraphicsPath オブジェクトで実行されるスケーリング、変換、回転操作は、自分のオブジェクトでも実行する必要があります。

たとえば、次のスケーリング コードがあります。

問題は、MyObject で「Transform」メソッドを実装する最良の方法は何かということです。かなりの検索を行いましたが、これを行うための最良の方法についての参照が見つかりませんでした。

ありがとう!

0 投票する
1 に答える
880 参照

.net - GraphicsPath.AddStringで文字間隔を管理するには?

GraphicsPath に文字列を追加するときに、文字間の距離を変更する必要があります。これを行う最善の方法は何ですか?

0 投票する
1 に答える
1251 参照

c# - DrawPath(Pen,GraphisPath) が OutOfMemoryException をスローしています

私はこれを数回経験しましたが、理解できません。メソッド DrawPath が System.OutOfMemoryException をスローしています。

pen.DashPattern が実際に System.OutOfMemoryException もスローしていることを確認したので、ダッシュ パターンを設定しましたが、それを修正してもエラーは回避されませんでした。

ここでの助けは素敵です!前もって感謝します!

0 投票する
1 に答える
1461 参照

c# - ビットマップの非透明領域から Region または GraphicsPath を作成する

描画されたビットマップのヒット テストを行い、指定された Point が画像の非透明ピクセルに表示されるかどうかを確認したいと考えています。

たとえば、ビットマップ四角形全体に対してこのテストを行うには、次のようにします。

ただし、非長方形アイテムのビットマップがあり、非透明領域をクリックしているかどうかを確認できるようにしたい場合、.NET フレームワークでこれを行う方法がサポートされていますか?

これを行う唯一の方法は、ビットマップ バイトを配列にロックし、それを繰り返し処理して、透明でない各 x、y 座標を Point 構造体の配列に追加することです。次に、これらのポイント構造を使用して GraphicsPath を組み立てます。

これらのポイントは 0 ベースであるため、マウスの位置を、画像が描画されている x、y 座標と 0、0 の間の距離でオフセットする必要があります。しかし、この方法では、画像が歪んでいないか、異なる方法でスケーリングされていない限り、画像を複数回描画する場合、基本的に各画像に同じ GraphicsPath を使用できます。

これが唯一の適切なルートである場合、ポイントを GraphicsPath に追加するにはどうすればよいですか? ポイントからポイントへ線を引きますか? 閉曲線を描く?

0 投票する
2 に答える
2557 参照

c# - .NetGraphicspathを使用したエンベロープの歪み

.netのGraphicsPathを特定の形状にワープするための最良の方法を見つけようとしています。私が達成しようとしている結果は、テキストを上、下、扇形の左、右、および波のようなものにワープすることです。これらはすべて、エンベロープディストーション機能を使用してAdobeIllustratorで実現できます。

事前定義されたグリッドとポイントマッピングシステムを使用してポイントを変換する独自の方法を採用することを検討しました。ただし、これをすでに利用できるようにする方法については、いくつかのアルゴリズムまたはサンプルがあるようです。

0 投票する
3 に答える
4271 参照

c# - 半透明のビットマップから GraphicsPath を作成する

GraphicsPath とポイントのリストを作成して、ビットマップの非透明領域の輪郭を形成したいと考えています。必要に応じて、各画像に不透明なピクセルのソリッド コレクションが 1 つだけあることを保証できます。したがって、たとえば、ピクセルのエッジに沿って時計回りまたは反時計回りにポイントを記録し、完全な閉ループを実行できるはずです。

このアルゴリズムの速度は重要ではありません。ただし、いくつかのポイントをスキップして、より小さく複雑でない GraphicsPath に削減できる場合、結果のポイントの効率は半重要です。

ほとんどの画像で完全に機能する現在のコードを以下にリストします。ただし、より複雑な一部の画像は、間違った順序で接続されているように見えるパスになってしまいます。これが発生する理由はわかっていると思いますが、解決策が思いつきません。

ポイントをパスに変換すると、次のようになります。

ここに私が欲しいものを示す例があります。赤いアウトラインは、ヒット検出を実行し、アウトライン ペンを描画し、ブラシで塗りつぶすために、GraphicsPath にすることができるポイントの配列である必要があります。

アウトラインの例

0 投票する
1 に答える
719 参照

.net - 画像の不透明部分のすぐ内側に境界線を描画します

このスレッドはほとんど私が必要としているものです: 半透明のビットマップからGraphicsPathを作成する

しかし、彼は画像の周りに輪郭を描いています-私は画像の中にほんの数ピクセルを描く必要があります。基本的に、「Focus Rectangle」を描画しようとしています(長方形ではない場合を除く)。現在のコードにぴったり収まるように、結果はGraphicsPathの形式である必要があります。

プライベート関数GetImagePath(img as Image)asGraphicsPath...終了関数

[編集] わかりました、まず第一に、他の投稿からコードを機能させることさえできません。私はこの行でインデックスを範囲外にし続けます:

* byte alpha = originalBytes [y *bitmapData.Stride + 4 * x + 3]; *

それはそれが最初に他のものをすり抜ける場合です。多くの場合、画像の大部分が不透明である場合、不透明なポイントが見つからなかった最初のループから発生します。

最新の問題は、意味をなさないポイントのリストが作成されることです。画像は68x68です私のポイントのリストには290x21のようなポイントがあり、2316x-15のようなもっとクレイジーなポイントもあります

これは私の元の画像です:

[原因imnewをアップロードさせません]

70x70のボタンの背景画像-それが重要な場合。