C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[13]: intで取得したカラー情報をColor構造体に設定


(過去ログ 98 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■58779 / inTopicNo.1)  intで取得したカラー情報をColor構造体に設定
  
□投稿者/ asuka (34回)-(2011/04/26(Tue) 13:42:06)

分類:[C#] 

お世話になっております。

VC++で作られたシステムをC#で書き換えています。

旧システムで保存されたとあるカラー情報があります。

カラー情報はCOLORREF構造体(4バイト)を見立ててVC++のlong(4バイト)で保存されます。

C#のシステムでInt32(4バイト)で取得しています。

これを、System.Windows.Media.Color型へ変換したいのですが、やり方がいちいちわからず困っています。

System.Windows.Media.Color color = new Color();
color.A = 0x00;
color.R = Int32Colorの7〜8バイト目;
color.G = Int32Colorの5〜6バイト目;
color.B = Int32Colorの3〜4バイト目;

として実現出来るかな、と推測していますがこれでよろしいのでしょうか?


COLORREF構造体
0x00bbggrr




引用返信 編集キー/
■58780 / inTopicNo.2)  Re[1]: intで取得したカラー情報をColor構造体に設定
□投稿者/ shu (651回)-(2011/04/26(Tue) 14:00:47)
No58779 (asuka さん) に返信

ColorTranslator.FromWin32(COLORREF値)

でいいと思います。
引用返信 編集キー/
■58782 / inTopicNo.3)  Re[2]: intで取得したカラー情報をColor構造体に設定
□投稿者/ Hongliang (771回)-(2011/04/26(Tue) 14:17:01)
> ColorTranslator.FromWin32(COLORREF値)

そっちは System.Drawing.Color の方ですからちょっと回り道な感じ。
// WPF には System.Drawing の ColorTranslator に該当するのはないっぽい…。


> System.Windows.Media.Color color = new Color();
> color.A = 0x00;
> color.R = Int32Colorの7〜8バイト目;
> color.G = Int32Colorの5〜6バイト目;
> color.B = Int32Colorの3〜4バイト目;
> として実現出来るかな、と推測していますがこれでよろしいのでしょうか?

System.Windows.Media.Color の FromRgb 静的メソッドを使いましょう。
あと、n バイト目じゃなくて n ビット目です。
引用返信 編集キー/
■58783 / inTopicNo.4)  Re[1]: intで取得したカラー情報をColor構造体に設定
□投稿者/ よねKEN (690回)-(2011/04/26(Tue) 14:19:07)
2011/04/26(Tue) 14:28:09 編集(投稿者)

No58779 (asuka さん) に返信
> これを、System.Windows.Media.Color型へ変換したいのですが、やり方がいちいちわからず困っています。

WPFかSilverlightですか?

> System.Windows.Media.Color color = new Color();
> color.A = 0x00;
> color.R = Int32Colorの7〜8バイト目;
> color.G = Int32Colorの5〜6バイト目;
> color.B = Int32Colorの3〜4バイト目;
>
> として実現出来るかな、と推測していますがこれでよろしいのでしょうか?

特に問題ないかと思いますが、試してみればわかるのでは?

#<追記> ぐはっ。ビットじゃないですね。確かに・・・orz</追記>

No58780 (shu さん) に返信
> ColorTranslator.FromWin32(COLORREF値)
>
> でいいと思います。

System.Windows.Media.Color color = System.Windows.Media.Color.FromArgb(System.Drawing.ColorTranslator.FromWin32(COLORREF値).ToArgb());

#WPFでのColorTranslator相当って何が該当するのだろう?<まだ見つからず
引用返信 編集キー/
■58784 / inTopicNo.5)  Re[3]: intで取得したカラー情報をColor構造体に設定
□投稿者/ shu (652回)-(2011/04/26(Tue) 14:19:30)
2011/04/26(Tue) 15:21:30 編集(投稿者)
2011/04/26(Tue) 15:18:15 編集(投稿者)
2011/04/26(Tue) 15:12:59 編集(投稿者)

No58782 (Hongliang さん) に返信
>>ColorTranslator.FromWin32(COLORREF値)
>
> そっちは System.Drawing.Color の方ですからちょっと回り道な感じ。
> // WPF には System.Drawing の ColorTranslator に該当するのはないっぽい…。

System.Windows.Media.Color だったのですね。見間違えていましたmm


#以下追記

よねKEN さんのフォローしてくれた方法もSystem.Windows.Media.Color.FromArgbにa,r,g,bを渡すメソッドしかないようでした。

ということで結局以下のようにやってみました。

Dim colref = &HFFBBAA
Dim b = (colref And &HFF0000) >> 16
Dim g = (colref And &HFF00) >> 8
Dim r = (colref And &HFF)
Dim c = Color.FromArgb(255, CByte(r), CByte(g), CByte(b))

※VB.NETです
引用返信 編集キー/
■58790 / inTopicNo.6)  Re[4]: intで取得したカラー情報をColor構造体に設定
□投稿者/ よねKEN (691回)-(2011/04/26(Tue) 15:42:07)
No58784 (shu さん) に返信
> よねKEN さんのフォローしてくれた方法もSystem.Windows.Media.Color.FromArgbにa,r,g,bを渡すメソッドしかないようでした。

申し訳ありません。ツッコミの調べが甘く、間違った情報を書いてしまいましたm(_ _)m
フォローありがとうございます。

引用返信 編集キー/
■58805 / inTopicNo.7)  Re[5]: intで取得したカラー情報をColor構造体に設定
□投稿者/ asuka (35回)-(2011/04/26(Tue) 22:15:08)
shuさん、Hongliangさん、よねKENさんレスありがとうございます。
m(__)m

明記せずにすみませんでした、正確にはSilverlight4へ移行しています。
(5が出てしまいましたが…)

そしてバイトでなくビットでした、すみません。

あまりよくわかっていないのがビット演算なのですが、
7〜8ビット目は下記のようにしてとれるかと思うのですが、途中のビットを取るような方法が分かっていないです。TT
System.Windows.Media.Color color = new Color();
color.A = 0x00;
color.R = (Int32Color & ( 1 << 7 ) ) //7〜8ビット目;
color.G = (Int32Color & ( 1 << 5 ) ) //5〜6ビットが欲しいが5〜8ビット取得してる?
color.B = (Int32Color & ( 1 << 3 ) ) //3〜4ビットが欲しいが3〜8ビット取得してる?

shuさんに記載して頂いておりますコードですが、Int32で取得したカラー値が何であれ、

>Dim b = (colref And &HFF0000) >> 16
>Dim g = (colref And &HFF00) >> 8
>Dim r = (colref And &HFF)

と、HFF0000、HFF00、HFFでマスクしていけばよいのでしょうか。。。

MSDNを見る限り、COLORREF構造体のaの値は0x00なので、上記のように取得したb,g,r,があれば、

Color.FromArgb(255, CByte(r), CByte(g), CByte(b))ではなく、

Color.FromArgb(0, CByte(r), CByte(g), CByte(b))とすることで変換出来ているという認識でよいでしょうか?



引用返信 編集キー/
■58806 / inTopicNo.8)  Re[6]: intで取得したカラー情報をColor構造体に設定
□投稿者/ shu (658回)-(2011/04/26(Tue) 22:35:41)
No58805 (asuka さん) に返信

> >Dim b = (colref And &HFF0000) >> 16
> >Dim g = (colref And &HFF00) >> 8
> >Dim r = (colref And &HFF)
>
> と、HFF0000、HFF00、HFFでマスクしていけばよいのでしょうか。。。
C#でいうと 0xFF0000, 0x00FF00, 0x0000FFです。シフト演算は同じなのでマスクの後、シフトして下さい。


>
> MSDNを見る限り、COLORREF構造体のaの値は0x00なので、上記のように取得したb,g,r,があれば、
>
> Color.FromArgb(255, CByte(r), CByte(g), CByte(b))ではなく、
>
> Color.FromArgb(0, CByte(r), CByte(g), CByte(b))とすることで変換出来ているという認識でよいでしょうか?
Aは255が完全不透明なので0にすると透明になってしまうと思います。

引用返信 編集キー/
■58807 / inTopicNo.9)  Re[7]: intで取得したカラー情報をColor構造体に設定
□投稿者/ Hongliang (772回)-(2011/04/26(Tue) 22:59:04)
FromArgb じゃなくて FromRgb …
引用返信 編集キー/
■58809 / inTopicNo.10)  Re[8]: intで取得したカラー情報をColor構造体に設定
□投稿者/ shu (659回)-(2011/04/27(Wed) 07:49:59)
2011/04/27(Wed) 08:04:24 編集(投稿者)

No58807 (Hongliang さん) に返信
> FromArgb じゃなくて FromRgb …

確かにその通りですね。Aは必ず不透明(255)の状態なんだから十分ですね。
引用返信 編集キー/
■58815 / inTopicNo.11)  Re[9]: intで取得したカラー情報をColor構造体に設定
□投稿者/ asuka (36回)-(2011/04/27(Wed) 09:21:43)
2011/04/27(Wed) 09:25:42 編集(投稿者)

shuさん、Hongliangさん。

おつきあい頂きありがとうございます。

下記解説を読む限り、System.Windows.Media.ColorのメソッドにFromRgbが存在しているように思えるのですが、

実際次のようにコーディングするとFromRgbが存在しておらずFromArgbが存在しています。
http://127.0.0.1:47873/help/1-6844/ms.help?product=VS&productVersion=100&method=f1&query=FromRgb&locale=ja-JP&category=DevLang%3acsharp%00TargetFrameworkMoniker%3a.NETFramework,Version%3Dv4.0

//Int32Color:Int32型で読み込んだ旧システムのカラー値
byte b = (byte)((Int32Color & 0xFF0000) >> 16);
byte g = (byte)((Int32Color & 0x00FF00) >> 8);
byte r = (byte)(Int32Color & 0x0000FF);

System.Windows.Media.Color NewColor = new Color();
NewColor = System.Windows.Media.Color.FromArgb(255, r, g, b);
//↑FromRgbがメソッドにない。

何か悪い点はございますでしょうか?
引用返信 編集キー/
■58817 / inTopicNo.12)  Re[10]: intで取得したカラー情報をColor構造体に設定
□投稿者/ よねKEN (693回)-(2011/04/27(Wed) 09:27:30)
No58815 (asuka さん) に返信
> 下記解説を読む限り、System.Windows.Media.ColorのメソッドにFromRgbが存在しているように思えるのですが、
>
> 実際次のようにコーディングするとFromRgbが存在しておらずFromArgbが存在しています。
> http://127.0.0.1:47873/help/1-6844/ms.help?product=VS&productVersion=100&method=f1&query=FromRgb&locale=ja-JP&category=DevLang%3acsharp%00TargetFrameworkMoniker%3a.NETFramework,Version%3Dv4.0
>

Color構造体
http://msdn.microsoft.com/ja-jp/library/system.windows.media.color(v=vs.95).aspx

「解説」より引用:
>Color の Silverlight 実装は、Color.FromRgb をサポートしていません。

だそうです。
引用返信 編集キー/
■58818 / inTopicNo.13)  Re[10]: intで取得したカラー情報をColor構造体に設定
□投稿者/ shu (662回)-(2011/04/27(Wed) 09:33:45)
2011/04/27(Wed) 09:42:57 編集(投稿者)

No58815 (asuka さん) に返信


> http://127.0.0.1:47873/help/1-6844/ms.help?product=VS&productVersion=100&method=f1&query=FromRgb&locale=ja-> JP&category=DevLang%3acsharp%00TargetFrameworkMoniker%3a.NETFramework,Version%3Dv4.0
ローカルのURL(127.0.0.1)を張っても見れないです。ヘルプを見たということですね?


> System.Windows.Media.Color NewColor = new Color();
Fromで取得するので、ここでnewはいらないです。

No58817 (よねKEN さん) に返信
>「解説」より引用:
> >Color の Silverlight 実装は、Color.FromRgb をサポートしていません。
>
> だそうです。
Silverlight だとまた違うのですね。まだまだ勉強不足です。
引用返信 編集キー/
■58821 / inTopicNo.14)  Re[11]: intで取得したカラー情報をColor構造体に設定
□投稿者/ asuka (37回)-(2011/04/27(Wed) 10:23:06)
ご回答ありがとうございます。

よねさん。

詳しいサイト情報ありがとうございます。

shuさん
はい、ヘルプを見ました。
newの件ありがとうございます。
決まりのようにバカの一つ覚えになっていました。
注意します。


結局サポートしていないということで、

NewColor = System.Windows.Media.Color.FromArgb(255, r, g, b);

としようと思いますが、ヘルプを見ると「FromRgb メソッドは、アルファ チャネルの既定値 1を使用します。 」という記述がありました。

ここでアルファチャネルに255を設定してよいものなのでしょうか?
引用返信 編集キー/
■58824 / inTopicNo.15)  Re[12]: intで取得したカラー情報をColor構造体に設定
□投稿者/ よねKEN (694回)-(2011/04/27(Wed) 11:30:22)
2011/04/27(Wed) 11:34:10 編集(投稿者)
2011/04/27(Wed) 11:31:35 編集(投稿者)

No58821 (asuka さん) に返信
> NewColor = System.Windows.Media.Color.FromArgb(255, r, g, b);
>
> としようと思いますが、ヘルプを見ると「FromRgb メソッドは、アルファ チャネルの既定値 1を使用します。 」という記述がありました。

記述が紛らわしいですね。
私も詳しくありませんが、ここで言っているαチャネルは
FromRgbメソッドやFromArgbメソッドのパラメータに設定する値の話ではなく、
Color構造体が内部で持っている0〜1の値範囲で表されるαチャネルの値のことだと思います。
※Color.FromScRgb メソッド の記述がそのまま流用されているように見えるので、
 FromRgbメソッドの解説としては適切でないように思います。

> ここでアルファチャネルに255を設定してよいものなのでしょうか?

下記の通りですので問題ありません。

Color.FromArgb
http://msdn.microsoft.com/ja-jp/library/system.windows.media.color.fromargb(v=vs.95).aspx

WPF環境でColor.FromRgbを実行した結果も見てみましたが、
A=255となっていますし問題ないと思います。
引用返信 編集キー/
■58827 / inTopicNo.16)  Re[13]: intで取得したカラー情報をColor構造体に設定
□投稿者/ asuka (38回)-(2011/04/27(Wed) 11:48:22)
よねKENさん

デバッグまでして頂き恐縮です。
m(__)m

私の方でも同色を確認できました。

最後までご教授頂き大変感謝です。

ありがとうございました。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -