colormarker文に16進数で文字色を入力するNo.37225
金之助 さん 19/03/08 16:10
 
お世話になっています。金之助といいます。

colormarker文の説明によると、文字色は24bitのRGB値で、0x0000ffが赤、0x00ff00
が緑、0xff0000が青となっています。しかし、一般に16進6桁のカラーコードで赤は0
xff0000、青は0x0000ffと表現されていると思うのですが、カラーコードの第6、5桁
目と第2、1桁目が入れ替わっているのは何か事情があるのでしょうか? 現状、Web上
に公開されている一般的な16進カラーコードをcolormarker文でそのまま使う場合、
正しい色を表示するために$r= rightstr($r, 2) + midstr($r, 2, 2) + leftstr($r,
 2); #v= val("0x"+$r); などとコードの先頭と末尾の2文字を入れ替えてやる必要が
あります。

一方、変数を介して #red=0xff0000; colormarker #red, -1, 11, 0; のように数値
に変換してからコードを与えれば、上の問題は生じません。あくまでもcolormarker
文の16進コードの入力上の解釈に限定される挙動のようです。

[ ]
RE:37225 colormarker文に16進数で文字色No.37226
金之助 さん 19/03/08 16:51
 
後段の説明は私の勘違いのようです。変数を介してコードを渡す場合も上位桁と下位
桁の入れ替えが必要なようです。


>お世話になっています。金之助といいます。
> ......
>一方、変数を介して #red=0xff0000; colormarker #red, -1, 11, 0; のように数値
>に変換してからコードを与えれば、上の問題は生じません。あくまでもcolormarker
>文の16進コードの入力上の解釈に限定される挙動のようです。

[ ]
RE:37225 colormarker文に16進数で文字色No.37228
秀丸担当 さん 19/03/08 17:19
 

RGBで赤が0x0000ffとなっているのは、24bitで1つの値としたときに、Windowsのプロ
グラムとしてリトルエンディアンでメモリ上に格納されることに由来しています。
由来しているというだけで、最初から表面的には逆にしておけば逆にできましたが、
従来からそうなっていることもあり、従来からのものに合わせています。

今はhtmlで赤を先に書くのが当たり前になりましたが、昔は赤が下位にくるのはそこ
そこ普通だった気がします。
プログラム的にはCOLORREFのとうWindowsの型が元になっています。
正確には32bitの1つの数値で、0x00112233の場合、33 22 11 00という順番のバイト
列になっています。
ちなみにUnicode(UTF-16,リトルエンディアン)も、テキストファイルをバイナリで見
るとバイトの順番が逆に格納されていたりします。
htmlは、24bitで1つの値というより計24bitの3つの値の羅列なのだと思います。(計
12bitで#fffとかでも書けるので)

[ ]
RE:37228 colormarker文に16進数で文字色No.37232
金之助 さん 19/03/08 20:38
 
ご回答、ありがとうございます。内部表現的にはむしろ自然だということですね。

例えば、htmlから取得した文字列 #orchid=0xDA70D6; を colormarkerで塗る場合、0
xDA70D6 を 8bit x 3 = 24bitの3つ組と見なし、DAとD6を入れ替えた上で、val("0xD
670DA")をcolormarkerに与える、という理解でよろしいでしょうか?

>
> ......
>htmlは、24bitで1つの値というより計24bitの3つの値の羅列なのだと思います。
>(計12bitで#fffとかでも書けるので)

[ ]
RE:37232 colormarker文に16進数で文字色No.37234
秀丸担当 さん 19/03/11 09:45
 

htmlにあった16進数6桁の文字列が"#DA70D6"だとして、colormarker文に直接書く場
合はvalを付けずに0xD670DAとしてもできますが、文字列を入れ替えて作る場合は、
既にやらている通りval("0xD670DA")という形にして変換するのがいいと思います。

[ ]