- PR -

C#の画像作成で文字を部分的に色を変えたい

1
投稿者投稿内容
未記入
大ベテラン
会議室デビュー日: 2005/08/25
投稿数: 145
投稿日時: 2009-01-12 19:39
C#のDrawStringで文字の左半分と文字の右半分で
色を変えたいです。
LinearGradientBrushを使えばグラデーションになってしまうので
そうではなく単純にまっぷたつにして
色を変えたいのです。
ご存知の方教えて頂ければ幸いです。
asahi
会議室デビュー日: 2009/01/10
投稿数: 5
投稿日時: 2009-01-13 01:23
グラデーションのパターンはカスタマイズできるはずですが、それではダメですか?
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2009-01-13 10:31
引用:

未記入さんの書き込み (2009-01-12 19:39) より:
C#のDrawStringで文字の左半分と文字の右半分で
色を変えたいです。



左半分をDrawString、右半分をDrawStringしてはどうですか。
右半分の書き始めの位置はMeasureStringを使って左半分の文字の幅を計測すればよいかと思います。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2009-01-13 11:47
こんにちは。

引用:

未記入さんの書き込み (2009-01-12 19:39) より:
C#のDrawStringで文字の左半分と文字の右半分で
色を変えたいです。



描画矩形を半分ずつクリップしながら、DrawStringすればよいかも?

コード:
private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{

	Graphics g = e.Graphics;

	// DrawStringパラメータ

	const string text = "ABC";
	RectangleF rectDraw = new RectangleF(0, 0, this.ClientSize.Width, this.ClientSize.Height);
	Font font = new Font("Arial", 72);
	StringFormat sf = new StringFormat();
	sf.Alignment = StringAlignment.Center;

	// 左半分、右半分の色と矩形
	Brush[] brush = 
		{
			new SolidBrush(Color.Blue),
			new SolidBrush(Color.Red)
		};
	RectangleF[] rectClip =
		{
			new RectangleF(rectDraw.Location, new SizeF(rectDraw.Width / 2, rectDraw.Height)), 
			new RectangleF(rectDraw.X + rectDraw.Width / 2, rectDraw.Y, rectDraw.Width / 2, rectDraw.Height)
		};

	// 左右をクリップを切り替えながら、2度描画する
	for (int i = 0; i < 2; i++) 
	{
		g.SetClip(rectClip[i]);
		g.DrawString(text, font, brush[i], rectDraw , sf);
	}
}


よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2009-01-13 11:53
#質問の意味と取り違えていたかも。

引用:

よねKENさんの書き込み (2009-01-13 10:31) より:
引用:

未記入さんの書き込み (2009-01-12 19:39) より:
C#のDrawStringで文字の左半分と文字の右半分で
色を変えたいです。



左半分をDrawString、右半分をDrawStringしてはどうですか。
右半分の書き始めの位置はMeasureStringを使って左半分の文字の幅を計測すればよいかと思います。



「1文字の途中で左半分、右半分」という意味でしたら、私の方法はダメですね。
未記入
大ベテラン
会議室デビュー日: 2005/08/25
投稿数: 145
投稿日時: 2009-01-13 20:11
みなさんご解答ありがとうございます。

アドバイスをいただいておいて恐縮ですが
文字を真っ二つにして色をわけたいという意味です。

Tdnr_Symさんはコードまでのせていただいて
ありがとうございます。
やってみたら見事にできました。

ちなみにSetClipをクリアしたいときはどうしたらよいのでしょうか?
この処理の後別の処理が待っているので
それに影響がでてしまいます。
クリアではなくやはり
g.SetClip(new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height);
という方法しかございませんでしょうか?

追加ではございますかお付き合い頂ければ幸いです。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2009-01-14 09:26
引用:

未記入さんの書き込み (2009-01-13 20:11) より:
アドバイスをいただいておいて恐縮ですが
文字を真っ二つにして色をわけたいという意味です。



こちらこそ、「文字の左半分と文字の右半分」
と書かれているのに"文字列"だと勘違いしてすみません。

引用:

この処理の後別の処理が待っているので
それに影響がでてしまいます。



影響で無いようにするには、処理前にSaveメソッドでGraphicsの状態を保存し、
処理後にRestoreメソッドで復旧するとよいと思います。
以下のような感じです。

コード:
GraphicsState gs = g.Save();

// 左右をクリップを切り替えながら、2度描画する ←省略してます

g.Restore(gs);


未記入
大ベテラン
会議室デビュー日: 2005/08/25
投稿数: 145
投稿日時: 2009-01-16 20:35
よねKENさんありがとうございます。
Restoreというのがあるのですね。
参考になりました。

引用:

よねKENさんの書き込み (2009-01-14 09:26) より:
引用:

未記入さんの書き込み (2009-01-13 20:11) より:
アドバイスをいただいておいて恐縮ですが
文字を真っ二つにして色をわけたいという意味です。



こちらこそ、「文字の左半分と文字の右半分」
と書かれているのに"文字列"だと勘違いしてすみません。

引用:

この処理の後別の処理が待っているので
それに影響がでてしまいます。



影響で無いようにするには、処理前にSaveメソッドでGraphicsの状態を保存し、
処理後にRestoreメソッドで復旧するとよいと思います。
以下のような感じです。

コード:
GraphicsState gs = g.Save();

// 左右をクリップを切り替えながら、2度描画する ←省略してます

g.Restore(gs);




1

スキルアップ/キャリアアップ(JOB@IT)