トップ 戻る | ハッカーと画家 コンピュータ時代の創造者たち |
|
最近のペイントの色作成などで使用するカラーダイアログでは、おなじみの赤緑青での指定に加え「色合い/鮮やかさ/明るさ」で色を指定することもできます。この方式は、どうやら「HSL」という色と明るさを分離した色の指定方式(色空間)のようで、シェル関連APIにはRGBとHSLを相互に変換するAPIも用意されています。 RGBとHSLの相互変換HSLは、色合い(H)、鮮やかさ(S)、明るさ(L)を0-240(Hは0-239)の数値で表します。RGBとの関係はなかなか複雑ですが、APIを使えば簡単に変換できるので、とりあえず遊んでみるだけなら気にしないでよいでしょう(^^;。気になる方は、MSDN(比較的新しいVC++のドキュメントやオンラインのMSDNサイト)でHSLまたはHLS(ドキュメントやAPIの名前には、HSLとHLSが混在しています)で検索すれば、変換処理の具体的な内容を見ることができます。 このHSLとおなじみのRGBの変換ですが、APIで行う場合はColorRGBToHLS()/ColorHLSToRGB()を呼び出すだけです。ただ、RGBといっても、RGBとしてやり取りするのはCOLORREF(ビット列としてはBGR)なので、32ビットDIBのピクセル列をそのまま渡すことはできません。RとB(32ビット中の17-24、1-8ビット目)を入れ替える必要があります。 ColorRGBToHLS
ColorRGBToHLS(COLORREF clSrc, WORD *lpH, WORD *lpL, WORD *lpS); clSrcで指定されたCOLORREFの色をHSLに変換し、その結果をlpH/lpL/lpSが示すアドレスに格納します。 ColorHLSToRGB
ColorHLSToRGB(WORD wH, WORD wL, WORD wS); wH/wL/wSで指定されるHSLからCOLORREFを求め、その値を返します。 使い方は、特に難しくないですね。ただ、32ビットDIBのピクセル値(RGB)とCOLORREFとの間でも変換が必要になるのがやや面倒ですが。
実際の変換処理は、32ビットDIBピクセル列g_lpdwPixelに対して、以下のように行います。
プログラムプログラムを起動したら、ウインドウに適当な24ビットフルカラーBMPをドロップしてください。その後実行ボタンをクリックすると、func()の処理が実行され結果が表示されます。 ただ、Lをいじっていると、どうも真っ黒になる部分が出てきたりするようですね。また、変換のたびに誤差が出てくるはずですから、何度も処理を繰り返すときには注意が必要です。 なお、このColorRGBToHLS()/ColorHLSToRGB()を使うには、WindowsXP(デフォルトの2000/MEも可?)やIE5がインストールされた環境が必要です。また、ライブラリやインクルードファイルが必要なので、古い開発環境だとプログラムのビルドができないかもしれません。その場合は最近のSDKをインストールするなり、自分でdllからAPIを読み込んで使うなりしてください。 |
トップ 戻る | シーザム (防犯・護身用品専門店) |