2012-06-16 288 views
2

我正在尋找一種方法來更改顏色的色調,知道它的RGB組成,然後用獲得的RGB替換舊RGB的所有實例。例如,我想要紅色變成紫色,淺紅色,淺紫色等...... 它可以通過改變顏色的色調在Photoshop中完成。使用python更改顏色的色調

我到目前爲止的想法如下:將RGB轉換爲HLS,然後改變色調。

這裏是到目前爲止的代碼(多種顏色的改變,不只是一個,在「清單」列表中定義):

(正如你可能會注意到,我只是一個初學者,代碼本身是很骯髒;更清潔的部分可能來自其他SO用戶) 非常感謝!

import colorsys 

from tempfile import mkstemp 
from shutil import move 
from os import remove, close 

def replace(file, pattern, subst): 
    #Create temp file 
    fh, abs_path = mkstemp() 
    new_file = open(abs_path,'w') 
    old_file = open(file) 
    for line in old_file: 
     new_file.write(line.replace(pattern, subst)) 
    #close temp file 
    new_file.close() 
    close(fh) 
    old_file.close() 
    #Remove original file 
    remove(file) 
    #Move new file 
    move(abs_path, file) 

def decimal(var): 
    return '{:g}'.format(float(var)) 

list=[[60,60,60],[15,104,150],[143,185,215],[231,231,231],[27,161,253],[43,43,43],[56,56,56],[255,255,255],[45,45,45],[5,8,10],[23,124,193],[47,81,105],[125,125,125],[0,0,0],[24,24,24],[0,109,166],[0,170,255],[127,127,127]] 

for i in range(0,len(list)): 
    r=list[i][0]/255 
    g=list[i][1]/255 
    b=list[i][2]/255 
    h,l,s=colorsys.rgb_to_hls(r,g,b) 
    print(decimal(r*255),decimal(g*255),decimal(b*255)) 
    h=300/360 
    str1=str(decimal(r*255)) + "," + str(decimal(g*255)) + "," + str(decimal(b*255)) 
    r,g,b=colorsys.hls_to_rgb(h, l, s) 
    print(decimal(r*255),decimal(g*255),decimal(b*255)) 
    str2=str(decimal(r*255)) + "," + str(decimal(g*255)) + "," + str(decimal(b*255)) 
    replace("Themes.xml",str1,str2) 

編輯:問題是非常簡單的:R,G,B和H必須是0和1之間,我是0和更新後的代碼之間和255 0和360設置它們。

+0

你使用Python 3嗎?否則'/'表示一個整數除法,而不是'from __future__ import division' – jfs

+0

謝謝你指出。 – GermainZ

回答

2

您的顏色序列使用整數,但colorsys使用介於0.0和1.0之間的浮點值。在將它們穿過之前,將所有數字除以255.,然後乘以255並在得到它們之後截斷。

+0

你遲到了4分鐘,但無論如何感謝:D – GermainZ