問題タブ [system.drawing]
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.
gdi+ - Graphics.MeasureCharacterRangesが間違ったサイズ計算を行う
Webフォームアプリで画像の特定の部分にテキストをレンダリングしようとしています。テキストはユーザーが入力するので、バウンディングボックス内に収まるようにフォントサイズを変更したいと思います。
概念実証の実装でこれをうまく行っていたコードがありますが、現在、より大きなデザイナーからのアセットに対してそれを試しているため、奇妙な結果が得られています。
私は次のようにサイズ計算を実行しています:
次に、次の行を使用して、ファイルシステムからプルしている画像にテキストをレンダリングします。
どこ:
__fonts
はPrivateFontCollection
、PrivateFontCollection.GetFontBySize
を返す拡張メソッドですFontFamily
RectangleF __textBoundingBox = new RectangleF(150, 110, 212, 64);
int __minimumSize = 8;
int __startingSize = 48;
Brush __brush = Brushes.White;
int size
48から始まり、そのループ内で減少しますGraphics g
持っSmoothingMode.AntiAlias
てTextRenderingHint.AntiAlias
設定context
は(これはのメソッドSystem.Web.HttpContext
からの抜粋です)ProcessRequest
IHttpHandler
他の方法は次のとおりです。
今、私は2つの問題を抱えています。
まず、テキストが単語内に改行を挿入して折り返すことを要求することがありますが、これはちょうど収まらず、whileループが再びデクリメントする必要があります。Graphics.MeasureCharacterRanges
単語内でワードラップするべきではないのに、これがボックス内に収まると考える理由がわかりません。この動作は、使用されている文字セットに関係なく示されます(ラテンアルファベットの単語、およびキリル文字、ギリシャ文字、グルジア文字、アルメニア文字などのUnicode範囲の他の部分で取得します)。Graphics.MeasureCharacterRanges
空白文字(またはハイフン)でのみワードラップするように強制するために使用する必要がある設定はありますか?この最初の問題は、ポスト2499067と同じです。
第二に、新しい画像とフォントサイズにスケールアップすると、Graphics.MeasureCharacterRanges
高さが大幅にずれてしまいます。私が描いているのRectangleF
は画像の視覚的に見える領域に対応しているので、テキストが必要以上にデクリメントされていることを簡単に確認できます。しかし、私がそれにいくつかのテキストを渡すとき、GetBounds
呼び出しは私にそれが実際に取っているもののほぼ2倍の高さを与えています。
試行錯誤を使用し__minimumSize
て、whileループを強制的に終了するように設定すると、24ポイントのテキストがバウンディングボックス内に収まることがわかりますGraphics.MeasureCharacterRanges
が、画像にレンダリングされたテキストの高さは122px(バウンディング時)であると報告されていますボックスの高さは64ピクセルで、そのボックス内に収まります)。実際、問題を強制することなく、whileループは18ptまで繰り返され、その時点で適切Graphics.MeasureCharacterRanges
な値が返されます。
トレースログの抜粋は次のとおりです。
サイズが193×122で制限が212×64であるため、フォントサイズを24に
デクリメントします。サイズが191×117で制限が212×64であるため、フォントサイズを23に
デクリメントします。サイズが200×75で制限があるため、フォントサイズを22にデクリメントします。は212×64
フォントサイズを21にデクリメントします。サイズは192×71で制限は212×64
です。フォントサイズを20にデクリメントします。サイズは198×68で制限は212×64
です。フォントサイズを19にデクリメントします。サイズは185です。 ×65、制限は212×64
です。HESSELINKのVENNEGOORをDIN-Blackで18ptで書き込み、サイズは178×61、制限は212×64です。
では、なぜGraphics.MeasureCharacterRanges
私に間違った結果を与えるのですか?たとえば、ループが21ポイント前後で停止した場合のフォントの行の高さは理解できますが(結果をスクリーンショットしてPaint.Netで測定すると、視覚的にフィットします)、本来よりもはるかに進んでいます。率直に言って、それは間違った気の結果を返しているからです。
c# - System.Drawing.Bitmap オブジェクトから元の画像ストリームを抽出するにはどうすればよいですか?
ファイルを使用してアセンブリに画像を埋め込んでい.resx
ます。実行時に、画像をスタンドアロン ファイルに保存して、元のコンテンツを復元する必要があります。System.Drawing.Bitmap
インスタンスから元のファイル ストリームを抽出するにはどうすればよいですか? を使用してストリームを作成できることはわかっていますBitmap.Save()
が、これにより、PNG を PNG として保存し直した場合でも、画像がトランスコードされます (実際には膨張します)。
それとも、そもそものResource
ようにそれらを読んでいるのが私の間違いですか?Bitmap
c# - Visual Studio 2010 Express を使用して描画できるサーフェスを作成する
私は Java のバックグラウンドを持っており、言語を学ぶために C# に書いた Conway のライフ ゲームの単純なバージョンを移植しようとしています。
Java では、JComponent から継承し、paint() をオーバーライドして出力を描画しました。私の新しいキャンバス クラスには、読み取り/操作が可能なシミュレーションのバックエンドのインスタンスがありました。次に、WYSIWYG GUI エディタ (NetBeans の Matisse) を入手して、キャンバスを視覚的に配置できるようにしました。
C# では、何かを描画するために OnPaint() をオーバーライドする必要があることを収集しました。これには (私の知る限り) 何かから継承する必要があります (私は Panel を選択しました)。Windows フォーム エディターでカスタム クラスを配置する方法がわかりません。また、生成されたコードのどこにクラスを配置する必要があるかもわかりません。
どうすればこれを行うことができますか?すべての描画コードをサブクラスに入れるのは本当にどうすればよいですか? Google で簡単な答えが見つからないということは、ここで何か重要なことを見逃していることを示唆しています。誰かが WPF でもこれを行う方法を提案したい場合は、聞いてみたいです。
ありがとう
text - .Net 2.0 で混合形式のテキストを描画する方法
.Net 2.0 で混合形式のテキストを描画する方法はありますか? 私は似たようなものを探しています
この方法に関する私の問題は、テキスト全体に対して 1 つの書式スタイルしか許可されないことです。しかし、さまざまな書式スタイルを持つテキストを描画する必要があります (たとえば、テキストの一部に下線を引き、別の部分を太字にするなど)。
どうもありがとう!
オリバー
c# - GDI 図面を bmp にエクスポートするときに「実際の」色を取得する方法
メソッドを使用して、インメモリを作成する画像を返しSystem.Windows.Forms.Control
、レンダリングされたコントロールを PNG に圧縮されたビットマップとしてエクスポートする ASP.Net Web ハンドラーを開発していますDrawToBitmap()
。色の割り当てに関する問題を除いて、クラスは今のところ完全に機能しています。たとえば、これは Web ハンドラーによって生成された Gauge です。
ゲージの内部に割り当てられた色は、赤 ( #FF0000
)、黄 ( #FFFF00
)、緑 ( #00FF00
) ですが、各色のくすんだバージョンしか得られません (#CB100F
赤、#CCB70D
黄、#04D50D
緑)。
背景は、色のグラデーションを含む bmp ファイルです。背景がサンプルのグラデーション、黒キャンバス、白キャンバス、透明キャンバスのいずれの場合でも、背景が設定されていない場合でも色抜けが発生します。
- 黒の背景で
- 背景透過あり
- 白い背景で
- 背景セットなし
- Format32bppArgb のピクセル形式で
複数のビットマップの色深度、出力形式、圧縮レベルなどを試しましたが、どれも機能していないようです。何か案は?
これはソース コードの抜粋です。
c# - ASP.Net で特定のフォントをプログラムで使用できない
ASP.Net で指定されたフォントを使用してビットマップをプログラムで作成しようとしています。アイデアは、テキスト、フォント名、サイズの色などが変数から渡され、フォントなどを使用したテキストのビットマップが返されるというものです。ただし、特定のフォントで次のコードを使用することしかできないことがわかりました。
コメントで示された領域のフォント名を Arial または Verdana に変更すると、画像とラベルの両方が正しいフォントで表示されます。ただし、両方の場所のフォント名を「Segoe Script」に変更すると、ラベルは Segoe Script で表示されますが、画像は Arial のように見えます。
アップデート:
この質問hereに基づいて、 PrivateFontCollection() を使用してフォントファイルをロードすることで機能させることができました。
c# - プログラムで作成されたビットマップのサイズを調整して、そこに描かれたテキストと一致させるにはどうすればよいですか?
次の.ashxページがあり、いくつかのクエリ文字列パラメータを受け取り、指定されたテキストが書き込まれたビットマップを返します。私が抱えている問題は、現在、ビットマップの初期サイズを100 X 100に手動で設定していることです。実際に必要なのは、ビットマップに書き込まれたすべてのテキストを含めるのに十分な大きさのビットマップにすることです。これどうやってするの?
更新: ビットマップを必要以上に大きく作成し、そのビットマップからグラフィックを取得し、MeasureStringメソッドを使用して、書き込むテキストのサイズを取得してから、ビットマップのその部分を次のような新しいビットマップにトリミングしました。それで。
c# - フォントをインスタンス化するときに複数のFontStylesを設定するにはどうすればよいですか?
System.Drawing.Fontクラスのコンストラクターを見ると、System.Drawing.FontStyle列挙型で定義されているFontStylesの1つを渡すためのパラメーターがあります。
すなわち。太字の斜体の通常の下線
インスタンス化されたオブジェクトには、太字、斜体、下線などのブールプロパティがありますが、これらは読み取り専用です。
太字や下線などの複数のスタイルを持つようにフォントを定義したい場合はどうなりますか?
これどうやってするの?
c# - DrawStringを使用して境界線のないテキストを描画する
私はこのコードを持っています。
ただし、テキストが私の画像に描画されると、黒の境界線または影が付いた赤になります。
境界線や影のない画像にテキストを書き込むにはどうすればよいですか?
編集
追加することでこれを解決しました。
誰かが私がこれを必要とした理由を説明できれば、それは素晴らしいことです。
c# - System.Drawingの元に戻すボタン?
私は自分で楽しむために画像エディタを作成していますが、最後に行ったペイントを元に戻すための元に戻すボタンをどのように作成できるのでしょうか。私はこれについてどうするか知りたいのですが、チュートリアルやサンプルコードがいいか、少なくとも私を正しい方向に向けてくれるものになるでしょう。
ありがとう!