「色しらべ」技術的な話 色変換ライブラリ ColorMineのPCL対応について
「JXUGC #17 お前の Xamarin アプリを見せてみろ!」で発表できなかった誰も興味ないであろう話を何回かでしていきたいと思います。
「色しらべ」というアプリでオープンソースのColorMineというライブラリを使用しました。このライブラリは結構前に更新が止まっていてPCLにはもちろん非対応でした。今回はこのライブラリをPCLに対応した話をしていきます。
ColorMineとは
これは例えばRGB→CMYKといった色空間の相互変換するライブラリで12種類の色空間に対応していて、XyzやYxyまでサポートしてくれる素敵すぎるものです。
以前に興味本位でRGB→マンセルの変換をしてみたくてこのColorMineにマンセルとHEXを追加したものを作ったんですが、マンセルの変換にはYxyの値が必要だったのでこのライブラリは本当にありがたかったです。
kamusoft.hatenablog.jp
今回はこの時作成したColorMine改をベースにしました。
作成したもの
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
おわりに
「色しらべ」は言ってしまえば、このライブラリの結果を出力しているに過ぎないので、似たようなのは誰でも作れますが(笑)、今後とも「色しらべ」をよろしくお願いします。