2

Haskell で gtk2hs を使用していますが、答えが見つからない問題に遭遇しました。

私は非常に単純なプログラムを書いています: それは色の値 (または複数の色の値) を取り、それらに関数を適用します。補色、色のセットの平均などを行うことができます。Glade でのインターフェイスの組み立てが完了し、gtk2hs の使用に関するいくつかの簡単なチュートリアルを読みました。これまでのところすべてが機能しており、プログラムを実行するとインターフェイスが表示されます。

ただし、私の問題はColorSelectionウィジェットにあります。そこから値を取得すると、それが与える値はタイプColor Word16 Word16 Word16であり、それぞれが0から65535の間です。私ができるようにしたいのは、理想的にはそれWord16を16進数のトリプレットに変換することです。StringHexトリプレットに変換できます。これまでのところ、色が HTML スタイルの rrggbb ではなく、rrrrggggbbbb として保存されているという事実と関係があるように思われることがわかりました。このコードを使用して、私が見つけたもの:

colorToHex (Color a b c)
    =  (showHex a "") ++ " " ++ (showHex b "") ++ " " ++ (showHex c "")

ほとんどの場合は正確ですが、カラー ピッカー ツールを使用すると、出力された色とは異なるように見える色を入力できます。たとえば、カラー ピッカーを使用して選択しました#A9D06Eが、関数は を返し"aa11 d12d 6e41"ました。かなり近い関係ですが、関係を理解することはできません.この例では、赤のチャネルの丸めはどのように機能しますか? また、16 進数値#A9D06Eを直接入力すると、"a9a9 d0d0 6e6e".

ColourHoogle を使用して、 aを aに変換する関数String、または aを他のものに変換する関数を見つけようとしました。またColour、Hackage で Gtk パッケージのドキュメントを検索しましたが、私が望んでいたことを行うものは何も見つかりませんでした。Colour私もインターネットを検索しましたが、タイプの扱いについてはあまり見つかりませんでした。ここの下部にある、まさに私が望んでいたことを行うための関数が1つ見つかりました。ただし、これには同じ問題があり、カラー ピッカー自体が特定の選択に対して与えた値と同じ値を与えません。

更新 1

また、値をビットシフトしてみました。ほとんどの場合、8 ビットでシフトすると正しい値が得られますが、私が試した他のことによると、わずかにずれていることがよくあります。

4

1 に答える 1

1

ここで自分の質問に対する答えを見つけたと思います-少し掘り下げた後、やりたいことはGTKカラーピッカーが私に与えたものを変換することであることがわかりました-つまり、チャネルあたり16ビットですcolor - 8 bpc カラーに。それを武器に、アドビフォーラムでこのページを見つけました。そこに投稿された回答を使用して、タイプの値をHexトリプレットに変換するHaskellコードをいくつか書きColorました。私が見つけた限りでは、カラーピッカー自体で報告された値と常に一致するようです。私が使用しているコードは次のとおりです。

toHex :: (Integral a, Show a) => a -> String
toHex i
  | length o == 1 = '0':o
  | otherwise     = o
  where
    o = map toUpper $ showHex i ""

d16to8 :: Integral a => a -> Integer
d16to8 i = (255 * d16to15 + 16385) `div` 32768
  where d16to15 =  (32768 * (toInteger i) + 32768) `div` 65535

colorToHex :: Color -> String
colorToHex (Color a b c) = (toHex.d16to8 $ a) ++ (toHex.d16to8 $ b) ++ (toHex.d16to8 $ c)
于 2014-07-12T20:30:42.073 に答える