今日はWindowsXPでの16ビット色を、手探りで調べてみた。
とても疲れたけど、きっと誰かの役に立つはず。(^o^)
というか16ビットの環境での、レイヤード透過色指定に使いたかった。

はそれぞれ32色(5ビット)

  0,  8, 16, 24, 33, 41, 49, 57
 66, 74, 82, 90, 99,107,115,123
132,140,148,156,165,176,181,189
198,206,214,222,231,239,247,255

64色(6ビット)

  0,  4,  8, 12, 16, 20, 24, 28
 32, 36, 40, 44, 48, 52, 56, 60
 65, 69, 73, 77, 81, 85, 89, 93
 97,101,105,109,113,117,121,125
130,134,138,142,146,150,154,158
162,166,170,174,178,182,186,190
195,199,203,207,211,215,219,223
227,231,235,239,243,247,251,255

つまり緑の色の表現が、ほかの色に比べて多いことが分かった。
これ簡単に変換できる計算式ないかなー。

とりあえず、いつものHSPを使って、
単純に一番近い色を拾ってテーブル作る関数を作ってみた。

#deffunc setchromakeyinit local base_r_b,local base__g_,local buff
	sdim chromakey_rb,256
	sdim chromakey_g,256
	dim base_r_b,32
	base_r_b( 0) =   0,  8, 16, 24, 33, 41, 49, 57
	base_r_b( 8) =  66, 74, 82, 90, 99,107,115,123
	base_r_b(16) = 132,140,148,156,165,176,181,189
	base_r_b(24) = 198,206,214,222,231,239,247,255
	dim base__g_,64
	base__g_( 0) =   0,  4,  8, 12, 16, 20, 24, 28
	base__g_( 8) =  32, 36, 40, 44, 48, 52, 56, 60
	base__g_(16) =  65, 69, 73, 77, 81, 85, 89, 93
	base__g_(24) =  97,101,105,109,113,117,121,125
	base__g_(32) = 130,134,138,142,146,150,154,158
	base__g_(40) = 162,166,170,174,178,182,186,190
	base__g_(48) = 195,199,203,207,211,215,219,223
	base__g_(56) = 227,231,235,239,243,247,251,255
	dim buff,4
	repeat 256
		buff(0) = cnt
		buff(1) = 9
		repeat length(base_r_b)
			buff(2) = abs(base_r_b(cnt) - buff(0))
			if(buff(2)<=buff(1)){
				buff(1) = buff(2)
				buff(3) = cnt
			}
		loop
		poke chromakey_rb,cnt,base_r_b(buff(3))
		buff(1) = 5
		repeat length(base__g_)
			buff(2) = abs(base__g_(cnt) - buff(0))
			if(buff(2)<=buff(1)){
				buff(1) = buff(2)
				buff(3) = cnt
			}
		loop
		poke chromakey_g,cnt,base__g_(buff(3))
	loop
	return

関連記事

  • HSPで高DPI対応ソフトを作ろうHSPで高DPI対応ソフトを作ろう こんにちは! 久しぶりにHSPの記事を書きたいと思います! 今回は、HSPの高DPI対応です。 はじめに 高DPIとはなんぞや、という説明をします。 昔のディスプレイは、1ドットのサイズが細かくないため、 1ピクセル=1ドットのような設計がほとんどでした。 そして、1ピクセルの大きさも、どのディスプレイもだいたい同じようなサイズ(96dpi)でし […] Posted in プログラミング
  • マップオンデマンドの地図更新でパスワードが入力できないマップオンデマンドの地図更新でパスワードが入力できない 車を購入時にカーナビとしてNSZT-W61Gを付けたのですが、 カーナビ購入してから3年間はマップ情報のバージョンアップが無料ということで、 バージョンアップをしようとしました。 バージョンアップ方法の流れ 1. 購入時についていた「マップオンデマンドセットアップディスク」のDVDでセットアップツールをインストール 2. 「GAZOO」を無料でユーザー登録(「TOYOTA […] Posted in 雑記
  • HSPでアルファチャンネル付きレイヤードウィンドウを実装したHSPでアルファチャンネル付きレイヤードウィンドウを実装した 以前、アルファ値付きのウィンドウを作りたくて、 リージョンではなくレイヤードウィンドウについて色々調べてたのですが、なかなかうまくいかず。 結局HSPは32bitのウィンドウではなくて24bitのウィンドウのために、 アルファ値付きは不可能なんだと勝手に決めつけ断念していました・・・ それで、もう1度、昨日から再度調査しなおしていたのですが、 UpdateLay […] Posted in ライブラリ制作
  • HSP3.2beta で strf の仕様が変わった件HSP3.2beta で strf の仕様が変わった件 以前、すぽいと君を1.077にバージョンアップした時に気がついた仕様? 書式変換の一部にstrfを使用しており、これがエラーの原因になってました。 せっかくですので紹介します。 HSP3.1 ではエラーにならないのに、HSP3.2beta でエラーになるというもの。 mes […] Posted in プログラミング
  • C言語のアドレス演算子の不思議C言語のアドレス演算子の不思議 前々から、C言語のポインタで不思議だったこと。 最適化C 言語 […] Posted in プログラミング
  • 指定した範囲の乱数を作成したい(実戦編)指定した範囲の乱数を作成したい(実戦編) みなさん、こんにちは。 さて、前回、前々回にわたって、 指定した範囲の乱数の作成の仕方を書きました。 改めて奥が深いですね。 読み忘れた方のためにリンクしますっ(^o^) 指定した範囲の乱数を作成したい(前編) 指定した範囲の乱数を作成したい(後編) 指定した範囲の乱数を作成したい(実戦編)←いまここっ! これまでの話では、 小さなより精度が […] Posted in アルゴリズム