十进制转16进制
碰到一个问题,rgb颜色值用16进制表示。此问题看起来很简单,用通用函数就能解决。但是通用函数有语言和各种系统的局限。于是自己的应用就自己写个代码。
我的需求是0-255的颜色值转16进制,转为16进制就2个字节。只要将rgb三个颜色值分别转为16进制字串拼接成一个字串就能用于应用程序了。
于是我就写了个简单简练的函数dec2hex ()。
怎么使用:我合并在rgb2cmy ()内
源码如下:
设全局变量
string ss, ss1, ss2, ss3 ; //输出字串
int H, S, V ; //计算 HSB
int R, G, B ; //计算 HSB
int max, min ;
int cc1, mm1, yy1, kk ; //CMYK
int D ; //dec2hex , input D=dec
string hex ; //dec2hex 输出16进制字串
string colorhex ; //输出应用 RGB hex$
dec2hex (){
// 0-255 十进制数转16进制
// input D=dec return hex
//此方法仅用于 RGB 转16进制表示
int h1,h2; //calculate hex 2个字节 255=FF
string hx1,hx2 ; //转字串
string hx$="0123456789ABCDEF" ;
//注:int类 D/16 只取整数,不计小数
h2=D-D/16*16 ; //计算 (D mod 16) 取余 D % 16
h1=D/16 ; //取整
hx2=subString (hx$, h2,1) ;
hx1=subString (hx$, h1,1) ;
hex=hx1+hx2 ; //合并字串, return hex
}//dec2hex ()
rgb2cmy (){
R=r1 ; G=g1 ; B=b1 ; //H调色板选色
// clearOutput () ; //调试
// print "RGB= ", R, " , ", G, " , ", B ;
cc1= (int)((255-R)/2.55) ;
mm1=(int)((255-G)/2.55) ;
yy1=(int)((255-B)/2.55) ;
// calculate k= min (cc1, min (mm1, yy1))
if (cc1<=mm1&&cc1<=yy1) min=cc1 ;
if (mm1<=cc1&&mm1<=yy1) min=mm1 ;
if (yy1<=cc1&&yy1<=mm1) min=yy1 ;
kk=min ;
if (kk != 0) kk = (int)(kk * kk/100) ;
print "CMYK = ", cc1," , " , mm1, " , ", yy1, " , ", kk ;
cs.SetFillMode (1) ;
cs.SetTextSize (18) ;
cs.SetColor (255,0,180,250); //bar 底擦除
cs.DrawRect (220,491,450,517);
cs.SetColor (255,225,225,225 ) ;
ss=intToString (cc1)+" , " ;
ss=ss+intToString (mm1)+" , " ;
ss=ss+intToString (yy1)+" , " ;
ss=ss+intToString (kk) ;
ss="CMYK = "+ss ;
cs.DrawText (ss, 220, 510 ) ; //界面statebar显示CMYK
//**** dec To hex and show hex 转换,
// 应用dec2hex ()
D=R ; dec2hex() ;
ss1=hex ;
D=G ; dec2hex() ;
ss2=hex ;
D=B ; dec2hex() ;
ss3=hex ;
ss="0x"+ss1+ss2+ss3 ;
colorhex=ss ; //用于输出应用
cs.SetColor (255,100,100,100); //擦除
cs.DrawRect (470,365,570,385);
cs.SetColor (255,225,225,225 ) ;
cs.DrawText (ss, 480, 380 ) ; //置选色块下
cs.Update ();
}//rgb2cmy ()
//****End****