需求說明
公司的 UI 設計小哥,已經轉用 Zeplin 很久了。 Zeplin 的設計稿展示頁面的顏色色值使用十進位的 RGB 表示的,在 Android 中的顏色表示大多情況下都需要十六進位的 RGB 表示。我的數學沒有好到直接看到十進制就可以心算得到十六進制的結果,所以我需要一個工具,輸入十進制的 RGB ,得到十六進制的色值,最好可以方便複製。
Zeplin 的色值顯示範例
原有處理方式
因為我會Python (僅限於終端輸入python 然後當做計算器算,或用hex() 函數把十進位轉換成十六進位),所以遇到這樣的問題我當然是採用python 的hex() 函數做轉換,然後手動結果輸入到Android Studio 中。
採用hex 函數手動轉換色值
動機
人總是懶得,想要寫這個小工具已經很久了,我也打過有過構思就是:
輸入: 類似RGB 的十進位值(110, 122 138),用空格或逗號分割一下。
輸出: 一個十六進位的 RGB 色值(#6e7a8a)。
但就一直沒動手,一直講究著。真懶!
開乾
1.首先我需要輸入函數
我打開我之前學習Python 的資料夾,裡面正好有一個raw_input 的範例:
Python程式碼
#!/usr/bin/python #coding=utf-8 raw_input("\n\n等输入")
在終端機執行python input.py 後, 可以輸入文字。
我需要接受到使用者輸入的資訊。怎麼接收忘記了, Google 之,得到結果,順便改改輸入提示語,打印出輸入的內容:
Python代碼
input = raw_input("\n输入颜色 比如50 144 60:\n") print(input)
2. 需要分割字元
查詢到python 字元分割函數split(),預設不傳入參數就可以用空白符分割。原本還說用英文逗號(,)當分隔符,現在看來可以省了,直接用空格分割,無論多少空格都可以自動分割。於是加上程式碼:
Python程式碼
rgbColorArray = input.split() print(rgbColorArray)
3. 需要遍歷陣列
簡單的遍歷陣列的是怎麼弄的也忘記了,同樣搜尋:
Python程式碼
for x in rgbColorArray: print(x)
4. 字元轉成十六進位
這個時候拿到了字串,要變成十六進位的字串。這時候需要兩個函數, int() 和 hex(),int 函數可以將字串轉成 int 類型,而 hex 則接受數字參數,傳回字串。 0x開始的字串。
於是就有了版的。
於是就有了第一個版本。
第一個版本
第一個版本
#第一個版本執行結果
寫出這樣的基礎版本已經基本上可以得到我想要的結果了,缺點是還需要我手動收入,動用大腦記憶十六進位色值然後輸入。希望可以直接複製最後結果。
再進一步
雖然結果已經出來了,但是還是希望可以在進步一些,有幾個問題:
1. 當要轉換的數字小於16的時候只有一位不顯示,例如11 顯示的結果是0xB
2. 現實的結果多了0x
3. 顯示的結果最好連在一起方便複製,而不是每個顏色一行。
那麼就需要遍歷顏色值數組,去掉0x 字串, 判斷小於16的前面補上0。連續在一起輸出結果。
for 循環遍歷數組
前面用到了 for 循環,是從查到的範例,不過多行就不知道怎麼弄了。 java 寫多了一般都是 { } 大括號括起來。
繼續查資料,於是知道是大概下面這樣的用法。
Python程式碼
#!/usr/bin/python # -*- coding: UTF-8 -*- for num in range(10,20): # 迭代 10 到 20 之间的数字 for i in range(2,num): # 根据因子迭代 if num%i == 0: # 确定第一个因子 j=num/i # 计算第二个因子 print '%d 等于 %d * %d' % (num,i,j) break # 跳出当前循环 else: # 循环的 else 部分 print num, '是一个质数'
变量声明
由于需要不换行,所以就需要字符连接,而不是直接 print。
声明变量又遇到问题了。根据前面的变量使用情况,找了些 python 代码看了看,大概知道不用声明什么类型,直接用就好了。于是有了代码:
Python代码
output = "#" for x in rgbColorArray: intx = int(x) output = output + hex(intx) print(output)
字符串裁剪和拼接
需要把多余的0x 两位去掉。
用到字符串裁剪,依然寻找范例。
Python代码
#!/usr/bin/python var1 = 'Hello World!' var2 = "Python Runoob" print "var1[0]: ", var1[0] print "var2[1:5]: ", var2[1:5]
这个范例的执行结果:
Python代码
var1[0]: H var2[1:5]: ytho
顺便问了旁边也在学习 python 的同事,他告诉我后面的索引可以省略,代表直接裁剪到结尾。
比如上面的例子如果 print "var2[1:]", var2[1:] 得到的结果应该是 ython Runoob
所以有代码:
Python代码
output = "#" for x in rgbColorArray: intx = int(x) output = output + hex(intx)[2:] print(output)
也可以从后往前数,比如还是上面的范例可以写成。比如上面的例子如果 print "var2[-1:]", var2[-1:] 得到的结果应该是 ob 也就是字符串的后两位。
于是我们这里可以写成hex(intx)[-2:] (因为输出字符串类似是0x23, 这样的)就是这个导致我后面写了个 bug,我也文章最后说明这个 bug 是什么。
if else 判断
接着要做一个判断,给一位的补上0
Python代码
if intx <p style="text-align: left;"><br> 这样就有了python 文件:<br>Python代码</p><pre class="brush:php;toolbar:false">#!/usr/bin/python #coding=utf-8 input = raw_input("\n输入颜色 比如50 144 60:\n") #print(input) rgbColorArray = input.split() print(rgbColorArray) output = "#" for x in rgbColorArray: intx = int(x) if intx <p style="text-align: left;"><br> 还有最后一步:把 ColorU 加入到环境变量中<br> 这个时候我可以得到我要的记过了,但是有点不太方便,我需要到这个 python 文件所在的目录下写<br>Python代码</p><pre class="brush:php;toolbar:false">python colorU.py
或者写全 colorU.py 这个路径。都是很麻的事情,所以我需要把 colorU 加入环境变量中。我用的是 zsh,所以找到环境变量的配置文件:~/.zshrc,末尾加上配置:
Python代码
alias colorU="python ~/Documents/Development/PythonStudy/colorU.py"
这个是经过另外以为同事指导后的最后可行版本,我最初的思路是把 colorU.py 文件设置成可执行文件,然后加入到 Path 当中。结果我把 colorU.py 这个文件的地址加入到了 Path 中,世界上PATH 应该是一个目录。这样添加别名的方式更方便。
也就是说如果我装客户端就可以不用我写的这个脚本了。但没关系我学习了 python,写了我自己的第一个真正有用的 python 代码。
2. 一个bug:我是在写这篇文章的时候才发现这个 bug 的,类似0x33这样的字符串从后往前裁剪的时候写[-2:],当然没有问题,但是写0xf 这样的字符串就会有问题了。程序输入 5 5 5得到的结果是 #0x50x50x5。修改成[2:] 的裁剪就可以了。
倒向裁剪字符串引起的bug
还可以继续升级体验:
a. 直接在终端中输入 colorU 231 234 123 就可以得到结果 #e7ea7b;
b. 配合Alfred, 呼出 Alfred 窗口后,输入色值,得到结果,回车直接复制十六进制到粘贴板。
c. 保存之前已经转换过的色值,方便重复使用的颜色,直接复制十六进制颜色。
以上是使用Python實作一個顏色色值轉換的小工具介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!