none
GetNearestColor Win32 API関数の動作について RRS feed

  • 質問

  • #別の所にて同様の質問をさせていただきましたが、反応がありませんので、

     一部内容を修正して投稿させていただいております。

     

    -----

     

    こんにちは。
    現在、GetNearestColorというWin32のAPI関数を使おうとしています。

    ヘルプを見てもいまいちはっきりしないのですが、

    この関数は、引数で指定した色について、

    ・現在の画面で正しく発色できる場合はそのまま
    ・現在の画面で発色できない色の場合は発色可能な近い色に変換して

    返してくれるものと自分は理解しています。

    そこで、ためしに画面をハイカラー(6万色)にした状態で、

    HDC hDC = GetDC( NULL );
    for( int i = 0; i < 256; i++ )
    {
       COLORREF clrA = RGB( 0, 0, i );
       COLORREF clrB = GetNearestColor( hDC, clrA );
       _ASSERT( clrA == clrB );    // 発色できない色の場合、捕えてほしい
    }

    ReleaseDC( NULL, hDC );

    としたところ、何故かASSERTされませんでした。

    ハイカラーでは青を256段階フルには表現できないはず

    どこかのタイミングでASSERTされるだろう

     

    と期待したのですが、何かこのAPI関数の理解が間違っているのでしょうか?
    それならばと、ためしに、

    HDC hDC = GetDC( NULL );
    for( int i = 0; i < 256; i++ )
    {
       COLORREF clrA = RGB( 0, 0, i );
       COLORREF clrB = GetNearestColor( hDC, clrA );
       _ASSERT( clrA == clrB );

       SetPixel( hDC, 0, 0, clrB );     // 実際にピクセルをプロットしてみる
       COLORREF clrC = GetPixel( hDC, 0, 0 );   // プロットした結果を取得(SetPixelの戻り値でもよいかも?)
       _ASSERT( clrB == clrC ); 
    }

    ReleaseDC( NULL, hDC );

    とすると、iの値によってはGetPixelの次でASSERTされてしまいました。


    たぶん私の理解がどこかで間違っているのだろうと思いますが、
    問題点をご教授いただけませんでしょうか?

    よろしくお願いします。

    #ビデオカードはIntel 965のオンボードビデオ。最新ドライバです。

    2008年11月29日 13:15

回答

  • GetNearestColor のヘルプを見ると、

    >
    指定された色の値を表現する目的で、システムパレット内の色のうち、実際に使われる色(近似色)の色の値を取得します。

    と書いてあります。
    http://msdn.microsoft.com/ja-jp/library/cc428708.aspx

    ハイカラーの場合はパレットを使用していませんので、入力した値がそのまま返ってくるのでしょう。
    256色モードの場合は期待通りの動作をするはずです。

    2008年12月1日 0:43

すべての返信

  • GetNearestColor のヘルプを見ると、

    >
    指定された色の値を表現する目的で、システムパレット内の色のうち、実際に使われる色(近似色)の色の値を取得します。

    と書いてあります。
    http://msdn.microsoft.com/ja-jp/library/cc428708.aspx

    ハイカラーの場合はパレットを使用していませんので、入力した値がそのまま返ってくるのでしょう。
    256色モードの場合は期待通りの動作をするはずです。

    2008年12月1日 0:43
  • なるほど、ヘルプの読みが浅かったです。

    ありがとうございます。

     

    2008年12月1日 2:00