kamulog

xamarin.formsのネタなど

「色しらべ」技術的な話 色変換ライブラリ ColorMineのPCL対応について

JXUGC #17 お前の Xamarin アプリを見せてみろ!」で発表できなかった誰も興味ないであろう話を何回かでしていきたいと思います。

「色しらべ」というアプリでオープンソースColorMineというライブラリを使用しました。このライブラリは結構前に更新が止まっていてPCLにはもちろん非対応でした。今回はこのライブラリをPCLに対応した話をしていきます。

ColorMineとは

これは例えばRGB→CMYKといった色空間の相互変換するライブラリで12種類の色空間に対応していて、XyzやYxyまでサポートしてくれる素敵すぎるものです。

以前に興味本位でRGB→マンセルの変換をしてみたくてこのColorMineにマンセルとHEXを追加したものを作ったんですが、マンセルの変換にはYxyの値が必要だったのでこのライブラリは本当にありがたかったです。
kamusoft.hatenablog.jp 今回はこの時作成したColorMine改をベースにしました。

作成したもの

github.com

PCL対応

さてXamarin.Formsで利用するためには当然このままでは利用できませんのでPCLに対応させることにしました。とりあえずPCLのプロジェクトを新規作成してそこ全コピーです。そのままビルドしてエラーになる箇所を片っ端から修正していきました。

  • System.Windows.Media
  • System.Drawing
  • DllImport

この辺りを使用している箇所ですね。

CMYKのプロファイル対応→やめよう

ColorMineはCMYKのプロファイルに対応しているようでその箇所がDLLImportしまくりで、代替アルゴリズムは自分の脳では思いつかないので、プロファイル変換部分はざっくり削除しました。幸い個人的用途ではプロファイルは必要なかったので。

HSL・HSV変換を自前で

HSL変換にはSystem.DrawingのColor.GetHue()とかであっさり変換してたんですが、それは当然使えないのでWikipediaで調べてコツコツ自前実装しました。HSVは0-100の範囲で表現しているのに、HSLはなぜか0-1の範囲だったのでHSVに合わせて分かりやすく0-100の範囲にしました。 HSV変換も同様に差し替えました。

完了!

当時はかなり苦労した記憶があるんですが、こうして書いてみるとたったこれだけだったんだとちょっとショックを受けました(笑)。

ついでに

以前にマンセルとHEXを追加していたので、今回ついでにXamarin.Forms.Colorの変換にも対応させました。まぁただの拡張メソッドですが。そしてもはや色空間じゃないですが…。

使い方

var xColor = Xamarin.Forms.Color.Red;
var Rgb = xColor.To<Rgb>();             //ToRgb 255,0,0
var Hex = Rgb.To<Hex>();                //ToHex #FF0000
var Munsell = Hex.To<Munsell>();        //ToMunsell 8.4R 5.2/21
var xColorRet = Munsell.ToXamarinForms(); //ToXamarinFormsColor

Console.WriteLine(Hex.ToString());      // #FF0000
Console.WriteLine(Munsell.ToString());  // 8.4R 5.2/21

基本的にTo<T>のジェネリックメソッドで変換していきます。
ただしXamarin.Forms.Colorへの変換だけはToXamarinFormsメソッドを使用します。
Xamarin.Forms.Colorから他へはToでいけます。

MunsellやHexのToStringでは値を文字列で返します。

注意事項

マンセルはあくまで近似値で正確な値を保証するものではありません。 そういうこともあってマンセルを相互変換していくとだんだん元の色との差が酷くなっていきます。他の色空間も多分同様だと思いますので、相互変換する場合はなるべくRGBをベースとして行うのが良いと思います。

Nugetで公開しています

通常版とXamarin.Forms版の違いはToXamarinForms拡張メソッドの有無だけです。

Xamarin.Forms対応版

https://www.nuget.org/packages/ColorMinePortable.Forms/

Install-Package ColorMinePortable.Forms

通常版

https://www.nuget.org/packages/ColorMinePortable/

Install-Package ColorMinePortable

おわりに

「色しらべ」は言ってしまえば、このライブラリの結果を出力しているに過ぎないので、似たようなのは誰でも作れますが(笑)、今後とも「色しらべ」をよろしくお願いします。