Tôi không chắc chắn nếu chủ đề này/câu hỏi vẫn còn hiệu lực nhưng tôi cũng đã được tìm kiếm một cách nào đó để chuyển đổi một màu sắc để ACI trên internet, nhưng thất bại. Trong trường hợp của tôi, tôi cần một phương pháp tốt hơn là tránh các thư viện bên ngoài và các chức năng CAD.
Tôi không thể trợ giúp với C#. Tôi thường làm việc với Lazarus/Free Pascal và sau nhiều lần dùng thử, tôi đã sử dụng một chức năng có vẻ hoạt động khá tốt đối với tôi. Vì vậy, tôi đăng các mã của tôi ở đây trong trường hợp chúng có thể hữu ích cho bạn hoặc cho người khác.
Codes của tôi là như sau:
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
tôi chắc chắn bạn sẽ có thể dịch đó vào C#, và hy vọng rằng điều này sẽ có ích cho ai đó.
Chúc mừng,
J-Eric J.
Nguồn
2013-07-21 18:44:27
Đó âm thanh tốt, tôi cố gắng làm điều đó :) Cảm ơn bạn –