【VB6|第17期】16进制颜色值与RGB值互相转换(含源码)

日期:2023年3月28日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006


在这里插入图片描述



一、前言

以前老是分不清颜色表示方法的原理,就知道网页比较喜欢用带#的颜色表示法(后来才知道,原来这个叫做十六进制颜色表示法),桌面程序比较喜欢用RGB颜色表示法。以至于遇到颜色表示法需要转换,就直接找颜色转换的网页来帮助完成工作。静下心来看看,原来也就这么回事,于是做了一个小工具,源码放到最后,安全无毒,可以放心食用的 ^ _ ^

二、原理浅谈

RGB颜色(RGB Color:由红、绿、蓝三种颜色组成的混合颜色,每种颜色的取值范围是0~255。

  • 第一个参数 RRed):红色;
  • 第二个参数 GGreen):绿色;
  • 第三个参数 BBlue):蓝色;

十六进制颜色(Hex Color:十六进制颜色码以“#”开头,后六位是分别由红、绿、蓝三种颜色组成的混合颜色,每种颜色的取值范围是0~255,用两位十六进制数表示。

  • 前面两位表示红色;
  • 中间两位表示绿色;
  • 后面两位表示蓝色;

看到这,相信聪明的小伙伴们会发现,两种表示法都是描述红、绿、蓝颜色通道,只不过用的进制不一样罢了,RGB Color用的是十进制,而Hex Color用的是十六进制,所以颜色转换本质上就是进制转换

举个浅粉红的例子,如下所示:

类型颜色表示红(R绿(G蓝(B
RGB ColorRGB(255, 182, 193)255182193
Hex Color#FFB6C1FFB6C1

进制转换计算:

FF = (15*16^1)+(15*16^0) = 240+15 = 255
B6 = (11*16^1)+(6*16^0) = 176+6 = 182
C1 = (12*16^1)+(1*16^0) = 192+1 = 193

知识加油站:
十六进制是计算机中数据的一种表示方法,逢十六进一,由0-9A-F组成,字母不区分大小写。与十进制的对应关系是:0-9对应0-9A-F对应10-15

三、代码实现

核心代码都在这里了,两种颜色的转换,详情如下所示:

1、RGB转十六进制(RGB Color to Hex Color)

Public Function RgbToHex(ByVal lValue As Long) As String
On Error Resume Next
'函数说明:RGB长整型值转换为16进制颜色值
'创建作者:Commas
'创建时间:2023-03-21
'修改时间:
'------数据格式说明------
'lValue:RGB的长整型值
'------数据格式说明------
    Dim red As Long
    Dim green As Long
    Dim blue As Long
    red = lValue And ColorConstants.vbRed
    green = (lValue And ColorConstants.vbGreen) / (2 ^ 8)
    blue = (lValue And ColorConstants.vbBlue) / (2 ^ 16)
    RgbToHex = "#" & Right$("0" & Hex(red), 2) & Right$("0" & Hex(green), 2) & Right$("0" & Hex(blue), 2)
End Function

2、十六进制转RGB(Hex Color to RGB Color)

Public Function HexToRgb(ByVal sHexColor As String) As Long
On Error Resume Next
'函数说明:16进制颜色值转换为RGB长整型值
'创建作者:Commas
'创建时间:2023-03-20
'修改时间:
'------数据格式说明------
'sHexColor:#FFF,#bfcddb
'------数据格式说明------
    Dim red As Long, green As Long, blue As Long
    
    If Left(sHexColor, 1) <> "#" Then
        HexToRgb = CLng(Val(sHexColor))
        Exit Function
    End If
    
    If Len(sHexColor) <= 4 Then
        Dim i As Integer, strTemp
        strTemp = "#"
        For i = 2 To Len(sHexColor)
            strTemp = strTemp & String(2, Mid(sHexColor, i))
        Next i
        
        sHexColor = strTemp
    End If
    
    red = Val("&H" & Mid(sHexColor, 2, 2))
    green = Val("&H" & Mid(sHexColor, 4, 2))
    blue = Val("&H" & Mid(sHexColor, 6, 2))
    HexToRgb = RGB(red, green, blue)
End Function

四、案例分享

在这里插入图片描述
任意输入RGBLong 或者 十六进制颜色表示法其中之一,另外两个就会自动计算出来。


下载地址:


版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.youkuaiyun.com/qq_35844043/article/details/129686350

### C语言结构体初始化的方法 在C语言中,结构体是一种复合数据类型,可以用来存储不同类型的数据。为了正确使用结构体,必须对其进行初始化。以下是常见的几种初始化方法及其示例。 #### 1. **顺序初始化** 按照成员定义的顺序依次赋初给各个成员。如果只需要初始化部分成员,则未初始化的部分会保持默认(通常是0或空字符)。需要注意的是,一旦某个成员被跳过,后续成员也不能再初始化[^3]。 ```c struct Test { int a; int b; char c; double d; }; // 定义并初始化结构体变量test1 struct Test test1 = {1, 2}; // 此处a=1,b=2,c和d取默认(通常为0) ``` #### 2. **指定成员初始化** 从C99标准起支持通过指定成员名的方式进行初始化。这种方式更加灵活,允许任意次序初始化,并且可以选择性忽略某些成员[^4]。 ```c struct Test { int a; int b; char c; double d; }; // 使用指定成员方式初始化结构体变量test2 struct Test test2 = {.b = 3, .c = 'X', .d = 78.5}; // 这里a未显式设置,默认为0 ``` #### 3. **动态内存分配后的初始化** 当利用`malloc()`或其他动态分配函数创建结构体实例时,需手动完成其内部各字段的设定工作。此时无法直接采用大括号列表形式来实现整体初始化,而应逐一访问每个域来进行具体数赋予操作。 ```c #include <stdlib.h> struct Student { char c; int score; char* name; }; void initializeStudent(struct Student *stu){ stu->c = 'A'; stu->score = 95; stu->name = "Tom"; } int main(){ struct Student *pStu = (struct Student *) malloc(sizeof(struct Student)); if(pStu != NULL){ initializeStudent(pStu); printf("c = %c, score = %d, name = %s\n", pStu->c, pStu->score, pStu->name); free(pStu); } } ``` 上述代码展示了如何先申请一块堆空间用于存放一个新的学生记录对象,之后调用辅助函数对其属性加以配置最后打印出来验证效果同时记得释放资源防止泄露问题发生。 ### 总结 综上所述,在实际开发过程中可以根据需求选用不同的初始化策略以满足特定场景下的应用要求。无论是静态声明还是运行间构建出来的实体都可以找到合适的办法去处理它们各自的初始状态调整事宜[^1][^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Commas.KM

码路共同进步,感恩一路有您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值