2011-09-05 53 views
6

現在、dxfファイルとやりとりするプログラムを作成しています。したがって、RGBカラー値を取り、AutoCADカラーインデックス(ACI)でもっとも近い色を返すルーチンが必要ですC言語のRGBカラーを最も近いACIカラーに変換する

誰かのコードや例がありますか?それがC#であればいいでしょうが、それは必要ではありません。

ありがとうございます。

答えて

5

一部のソース(たとえば、http://www.jtbworld.com/lisp/DisplayColorProperties.htm)からすべてのACIカラーのRGB値を取り出し、ACIカラーの配列を作成します。インデックスでACIカラーを取得するには、そのリストから色を選択するだけです。

RGBから「最も近い」マッチング後方参照を行うには、その配列をパスして最小距離でカラーを戻すだけです(たとえば、3色のチャネルの距離の二乗をチェックするなどして、 G、BとACI色であるR、G、B、その後距離をR、G、Bに最も近い一致である最小DISTを有するACIアレイにおけるどの色、

dist = (r-R)*(r-R) + (g-G)*(g-G) + (b-B)*(b-B); 

ある。

+0

は、私は:)ありがとうございことをやろう –

1

Andersが提案しているように、ハードコードされたACI色の配列を気にする必要はありません。AutoCAD Colorオブジェクトをそれぞれの有効なインデックスから取得し、RGB値を抽出できますそれはとしてColorValueというプロパティがあります。

Andersの回答の残りの部分に基づいた完全な解決策があります。Math.Pow(r - R, 2)(r - R)*(r - R)に置き換えると、「距離」計算のピタゴラスの意図がより明確に表現されているようです。ここで

byte r = 1, g = 203, b = 103; // input color 
double minDist = double.MaxValue; 
short match = 0; // this will end up with our answer 
for (short i = 1; i <= 255; ++i) 
{ 
    var color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(ColorMethod.ByAci, i); 
    System.Drawing.Color rgb = color.ColorValue; 
    double dist = 
     Math.Pow(r - rgb.R, 2) + 
     Math.Pow(g - rgb.G, 2) + 
     Math.Pow(b - rgb.B, 2); 
    if (dist < minDist) 
    { 
     minDist = dist; 
     match = i; 
    } 
} 
1

あなたは、私がこのスレッド/質問はまだ有効であるかどうかわからないですが、私はまた、上のACIに色を変換するために、いくつかの方法を探しているACI

var color = Autodesk.AutoCAD.Colors.Color(r, g, b); 
1

にRGBに変換する方法でありますインターネット、しかし失敗しました。私の場合、外部ライブラリとCAD機能を避ける方法が必要です。

私はC#で手助けできません。私は通常、Lazarus/Free Pascalで作業し、多くの試練の後、私にとってはうまく機能しているようだ。だから私はここに自分のコードを掲示しているので、あなたや他の人に役立つかもしれない。

私のコードは次のとおりである:

Function RGB2ACIDXFColor(MyColor : TColor) : Integer ; 
Var 
    OldCol, LowR, MidR, HiR : String ; 
    RCol, GCol, BCol, LowCol, MidCol, HiCol : Integer ; 
    StPt, HRatio, VRatio, Hemis : Integer ; 
Begin 
Result := 10 ; 
{Break Color Component (BGR Color)} 
{IntToHex & Hex2Dec are functions from Lazarus Libraries} 
OldCol := IntToHex(MyColor,6) ;  
BCol := Hex2Dec(Copy(OldCol,1,2)) ; 
GCol := Hex2Dec(Copy(OldCol,3,2)) ; 
RCol := Hex2Dec(Copy(OldCol,5,2)) ; 

{Find Color Component Priorities} 
LowCol := RCol ; 
LowR := 'R' ; 
If (GCol < LowCol) Then 
Begin 
    LowCol := GCol ; 
    LowR := 'G' ; 
End; //If 
If (BCol < LowCol) Then 
Begin 
    LowCol := BCol ; 
    LowR := 'B' ; 
End; //If 

HiCol := RCol ; 
HiR := 'R' ; 
If (GCol > HiCol) Then 
Begin 
    HiCol := GCol ; 
    HiR := 'G' ; 
End; //If 
If (BCol > HiCol) Then 
Begin 
    HiCol := BCol ; 
    HiR := 'B' ; 
End; //If 

MidCol := GCol ; 
MidR := 'G' ; 
If ((HiR = 'G') AND (LowR = 'R')) OR 
    ((HiR = 'R') AND (LowR = 'G')) Then 
Begin 
    MidCol := BCol ; 
    MidR := 'B' ; 
End; //If 
If ((HiR = 'G') AND (LowR = 'B')) OR 
    ((HiR = 'B') AND (LowR = 'G')) Then 
Begin 
    MidCol := RCol ; 
    MidR := 'R' ; 
End; //If 

{Refer to CAD color table} 
{Find Color Row} 
VRatio := Round((5 * (255 - HiCol))/255) ; 
VRatio *= 2 ; 
{Find Color Hemisphere} 
If (LowCol = 0) Then Hemis := 0 Else Hemis := 1 ; 

{Find Color Start Column And Incrementation} 
If (LowR = 'B') Then 
Begin 
    HRatio := Round((8 * GCol)/(GCol + RCol)) ; 
    Result := 10 ; 
End; //If 
If (LowR = 'G') Then 
Begin 
    HRatio := Round((8 * RCol)/(RCol + BCol)) ; 
    Result := 170 ; 
End; //If 
If (LowR = 'R') Then 
Begin 
    HRatio := Round((8 * BCol)/(BCol + GCol)) ; 
    Result := 90 ; 
End; //If 

HRatio *= 10 ; 
Result += HRatio + VRatio + Hemis ; 
If (Result > 249) Then Result -= 240 ; 
End; //Sub 

私はあなたがC#のにそれを変換することができます確信している、これは誰かに有用であろうことを願っています。

乾杯、

J-エリック・J.良い音

関連する問題