不少朋友向我诉过苦,
说渐变色不好做,
总是辣眼睛。
本期,
我用PPT做了这么个渐变生成器。
点一次,
就会生成一组和谐的渐变色。
不喜欢,
就多点几次,
遇到喜欢的,
直接格式刷到自己的形状上就行。
本着鱼和渔具都要给的原则,
接下来详细讲解一下原理和制作过程。
制作思路和关键步骤
1、色彩三要素:
这是PPT的颜色设置界面。
横轴代表了色相,
可以理解为颜色的名字。
比如红色、绿色、黄色等等,
纵轴代表了饱和度,
表示颜色中所含有色成分的比例,
饱和度越高,
颜色越鲜艳。
右侧单独的条形区域,
是明度。
色相、饱和度、明度,
称为色彩三要素,
用它们作为参数描述颜色,
就是HSL色彩模式。
它相比RGB色彩模式而言,
更符合人类思考习惯,
对控制颜色变化更有指导意义。
2、渐变原理
一束白光可以分解出所有色相。
我们保持S和L参数不动,
只变化一个H参数,
就相当于在一个娘生的兄弟里挑了两个出来。
举个实例,
在双色渐变中,
将第2个渐变滑块设置为和第1个滑块同色,
然后再点击色彩下拉栏中的【其他颜色】,
平行于横轴,
在原始颜色右侧不远处再选一个颜色,
这实际上就是只变化了色相,
这个渐变看起来就比较和谐。
再来一次,
回到原始颜色,
这次我不往右边找,
往左边找,
看起来也比较和谐。
这些都是色相渐变。
如果保持HSL的H和S不变,
只变化L,
就是明度渐变。
选中第二个滑块,
在右边条形控制区域,
直接将滑块给拉下来,
得到明度渐变。
这些都是明度渐变。
3、平面框架
色彩原理清楚了,
接下来做工具的平面框架,
我在页面上绘制了10个圆角矩形,
给它们设置渐变外框和外阴影,
增加一点儿设计感。
点击文件【选项】按钮,
在【自定义功能区】中,
找到【开发工具】并勾选,
菜单栏出现了开发工具选项卡,
插入一个【命令按钮】控件,
右键选择【属性表】,
在caption里输入内容文字。
平面框架完成。
4、VBA实现
接下来需要把逻辑流程变为程序,
双击控件打开VBA窗口,
按以下逻辑编程。
第一步:
随机生成一组HSL值。
第二步:
以 [0,255] 为范围,
自义定步长移动原始H和L值,
得到新的HSL值。
第三步:
因为PPT中的VBA填充对象没有HSL属性,
只有RGB属性,
所以需要自己定义转换函数,
将HSL值转换为软件能识别的RGB值。
第四步:
以原始值和多组新值为输入,
赋予每个形状渐变色。
具体的代码如下:
感兴趣的朋友也可在文末下载源文件查看。
滑动阅览
Private Sub CommandButton1_Click()
Set myDocument = ActivePresentation.Slides(1)
Dim h1 As Integer, h2 As Integer, h3 As Integer, h3_3 As Integer, h4 As Integer, h5 As Integer
Dim s As Integer
Dim l1 As Integer, l2 As Integer, l3 As Integer, l3_3 As Integer, l4 As Integer, l5 As Integer
Dim step As Integer,step_b as integer
h3 = Int(Rnd * 255) '界定初始HSL值
s = Int(Rnd * 56 + 200)
l3 = Int(Rnd * 100 + 65)
step = 25 '输入步长
step_b = 30
h2 = h3 - step
If (h2 < 0) Then
h2 = 255 + h2
End If
h1 = h2 - step
If (h1 < 0) Then
h1 = 255 + h1
End If
h3_3 = h3 + step
If (h3_3 > 255) Then
h3_3 = h3_3 - 255
End If
h4 = h3 + step * 2
If (h4 > 255) Then
h4 = h4 - 255
End If
h5 = h4 + step
If (h5 > 255) Then
h5 = h5 - 255
End If
l2 = l3 - step_b
If (l2 < 0) Then
l2 = 255 + l2
End If
l1 = l2 - step_b
If (l1 < 0) Then
l1 = 255 + l1
End If
l3_3 = l3 + step_b
If (l3_3 > 255) Then
l3_3 = l3_3 - 255
End If
l4 = l3 + step_b * 2
If (l4 > 255) Then
l4 = l4 - 255
End If
l5 = l4 + step_b
If (l5 > 255) Then
l5 = l5 - 255
End If
With myDocument.Shapes(1).Fill
.ForeColor.RGB = RGB(HSL2R(h3, s, l3), HSL2G(h3, s, l3), HSL2B(h3, s, l3))
.BackColor.RGB = RGB(HSL2R(h1, s, l3), HSL2G(h1, s, l3), HSL2B(h1, s, l3))
.TwoColorGradient msoGradientHorizontal, 1
.GradientAngle = 60
End With
With myDocument.Shapes(2).Fill
.ForeColor.RGB = RGB(HSL2R(h3, s, l3), HSL2G(h3, s, l3), HSL2B(h3, s, l3))
.BackColor.RGB = RGB(HSL2R(h2, s, l3), HSL2G(h2, s, l3), HSL2B(h2, s, l3))
.TwoColorGradient msoGradientHorizontal, 1
.GradientAngle = 60
End With
With myDocument.Shapes(3).Fill
.ForeColor.RGB = RGB(HSL2R(h3, s, l3), HSL2G(h3, s, l3), HSL2B(h3, s, l3))
.BackColor.RGB = RGB(HSL2R(h3_3, s, l3_3), HSL2G(h3_3, s, l3_3), HSL2B(h3_3, s, l3_3))
.TwoColorGradient msoGradientHorizontal, 1
.GradientAngle = 60
End With
With myDocument.Shapes(4).Fill
.ForeColor.RGB = RGB(HSL2R(h3, s, l3), HSL2G(h3, s, l3), HSL2B(h3, s, l3))
.BackColor.RGB = RGB(HSL2R(h4, s, l3), HSL2G(h4, s, l3), HSL2B(h4, s, l3))
.TwoColorGradient msoGradientHorizontal, 1
.GradientAngle = 60
End With
With myDocument.Shapes(5).Fill
.ForeColor.RGB = RGB(HSL2R(h3, s, l3), HSL2G(h3, s, l3), HSL2B(h3, s, l3))
.BackColor.RGB = RGB(HSL2R(h5, s, l3), HSL2G(h5, s, l3), HSL2B(h5, s, l3))
.TwoColorGradient msoGradientHorizontal, 1
.GradientAngle = 60
End With
With myDocument.Shapes(6).Fill
.ForeColor.RGB = RGB(HSL2R(h3, s, l3), HSL2G(h3, s, l3), HSL2B(h3, s, l3))
.BackColor.RGB = RGB(HSL2R(h3, s, l1), HSL2G(h3, s, l1), HSL2B(h3, s, l1))
.TwoColorGradient msoGradientHorizontal, 1
.GradientAngle = 60
End With
With myDocument.Shapes(7).Fill
.ForeColor.RGB = RGB(HSL2R(h3, s, l3), HSL2G(h3, s, l3), HSL2B(h3, s, l3))
.BackColor.RGB = RGB(HSL2R(h3, s, l2), HSL2G(h3, s, l2), HSL2B(h3, s, l2))
.TwoColorGradient msoGradientHorizontal, 1
.GradientAngle = 60
End With
With myDocument.Shapes(8).Fill
.ForeColor.RGB = RGB(HSL2R(h3, s, l3), HSL2G(h3, s, l3), HSL2B(h3, s, l3))
.BackColor.RGB = RGB(HSL2R(h3, s, l3_3), HSL2G(h3, s, l3_3), HSL2B(h3, s, l3_3))
.TwoColorGradient msoGradientHorizontal, 1
.GradientAngle = 60
End With
With myDocument.Shapes(9).Fill
.ForeColor.RGB = RGB(HSL2R(h3, s, l3), HSL2G(h3, s, l3), HSL2B(h3, s, l3))
.BackColor.RGB = RGB(HSL2R(h3, s, l4), HSL2G(h3, s, l4), HSL2B(h3, s, l4))
.TwoColorGradient msoGradientHorizontal, 1
.GradientAngle = 60
End With
With myDocument.Shapes(10).Fill
.ForeColor.RGB = RGB(HSL2R(h3, s, l3), HSL2G(h3, s, l3), HSL2B(h3, s, l3))
.BackColor.RGB = RGB(HSL2R(h3, s, l5), HSL2G(h3, s, l5), HSL2B(h3, s, l5))
.TwoColorGradient msoGradientHorizontal, 1
.GradientAngle = 60
End With
End Sub
Function CAL(v1, v2, v3)
If (v3 < 0) Then v3 = v3 + 1
If (v3 > 1) Then v3 = v3 - 1
If (v3 * 6 < 1) Then
CAL = v1 + (v2 - v1) * 6 * v3
ElseIf (v3 * 2 < 1) Then
CAL = v2
ElseIf (v3 * 3 < 2) Then
CAL = v1 + (v2 - v1) * ((2 / 3) - v3) * 6
Else
CAL = v1
End If
End Function
Function HSL2R(h, s, l)
Dim convert_h As Double, convert_s As Double, convert_l As Double
Dim temp_1 As Double, temp_2 As Double
convert_h = h / 255
convert_s = s / 255
convert_l = l / 255
If (s = 0) Then
HSL2R = l
Else
If (convert_l < 0.5) Then
temp_2 = convert_l * (1 + convert_s)
Else
temp_2 = (convert_l + convert_s) - (convert_s * convert_l)
End If
temp_1 = convert_l * 2 - temp_2
HSL2R = 255 * CAL(temp_1, temp_2, convert_h + (1 / 3))
End If
End Function
Function HSL2G(h, s, l)
Dim convert_h As Double, convert_s As Double, convert_l As Double
Dim temp_1 As Double, temp_2 As Double
convert_h = h / 255
convert_s = s / 255
convert_l = l / 255
If (s = 0) Then
HSL2G = l
Else
If (convert_l < 0.5) Then
temp_2 = convert_l * (1 + convert_s)
Else
temp_2 = (convert_l + convert_s) - (convert_s * convert_l)
End If
temp_1 = convert_l * 2 - temp_2
HSL2G = 255 * CAL(temp_1, temp_2, convert_h)
End If
End Function
Function HSL2B(h, s, l)
Dim convert_h As Double, convert_s As Double, convert_l As Double
Dim temp_1 As Double, temp_2 As Double
convert_h = h / 255
convert_s = s / 255
convert_l = l / 255
If (s = 0) Then
HSL2B = l
Else
If (convert_l < 0.5) Then
temp_2 = convert_l * (1 + convert_s)
Else
temp_2 = (convert_l + convert_s) - (convert_s * convert_l)
End If
temp_1 = convert_l * 2 - temp_2
HSL2B = 255 * CAL(temp_1, temp_2, convert_h - (1 / 3))
End If
End Function
编程完毕后播放幻灯片,
效果就出现了。
详细操作教程
整个设计的制作拆解为4个部分进行讲解,
以下为详细操作视频:
源文件分享
本文源文件已打包,
后台回复【渐变生成器】即可下载。